こんばんわ、TF's appsです。
今回の記事は【プログラミング】のノウハウ的な紹介です。
実話です。私が本業で1週間苦労したコードを紹介します。
私は組み込み系のソフト設計を約15年しています。
つい3カ月程前にこんなモンスター(バグ)と遭遇しました。
◆簡単にサンプルコードを記述します
ポイントは【for文が無限ループ】である点です。
funcBの戻り値が0の場合は無限ループします。
<補足>
・私が作ったわけではありません。先人のコードです。
・funcBの戻り値は「正常時が1以上」or 「異常時が-1」の想定です。
・ソフト全体としては最低数十万ステップになります。
・リアルタイムOSで動作しています。
・現象は突然フリーズするという情報しかありません。
・発生頻度は稀であるという情報です。
今回発生した現場では、まさに「戻り値が0」となってしまい、無限ループすることによりアプリがロックするという現象となりました。
funcBはデバイスからのデータ受信を行う関数です。
正常にデータを受信すれば「戻り値=1以上」となります。
異常時(デバイスが未接続など)は「戻り値=-1」となります。
今回デバイスに対して電気的なノイズがかかり、そのデバイスが瞬断(OSレベルで切断→再接続)しました。
その結果、「戻り値=0」になり続ける現象となりました。
これにより無限ループすることになりました。
このプログラムの欠陥は、
設計時にfuncBの戻り値が「0」になり続けるという想定が出来なかった事にあります。
対策としては、
funcBの「戻り値=0」が5回続けば、ループを抜けるという処理に変更しています。
一番伝えたい事
無限ループを使用する場合は、本当に無限で良いのかを検討すべきです。今回のような通常処理がループから抜けることを前提としている場合において、無限ループにする必要があるのかという点を考慮して設計するべきです。
いかがでしょうか。今回は自身がハマったコードについて紹介しました。またこのシリーズの紹介もしていきますね^^v
ではまた次回お会いしましょう♪