週末のアプリ作成

androidアプリ個人開発者の実態を報告します。アプリの収入も公開中です♪

私がプログラミングでハマったコードを紹介します。無限ループ

こんばんわ、TF's appsです。

今回の記事は【プログラミング】ノウハウ的な紹介です。

実話です。私が本業で1週間苦労したコードを紹介します。

 

私は組み込み系のソフト設計を約15年しています。

つい3カ月程前にこんなモンスター(バグ)と遭遇しました。

 

◆簡単にサンプルコードを記述します

f:id:TFs_apps:20190708223744p:plain

 

ポイントは【for文が無限ループ】である点です。

funcBの戻り値が0の場合は無限ループします。

 

<補足>

・私が作ったわけではありません。先人のコードです。

・funcBの戻り値は「正常時が1以上」or 「異常時が-1」の想定です。

・ソフト全体としては最低数十万ステップになります。

リアルタイムOSで動作しています。

・現象は突然フリーズするという情報しかありません。

・発生頻度は稀であるという情報です。

 

 

今回発生した現場では、まさに「戻り値が0」となってしまい、無限ループすることによりアプリがロックするという現象となりました。

 

funcBはデバイスからのデータ受信を行う関数です。

正常にデータを受信すれば「戻り値=1以上」となります。

異常時(デバイスが未接続など)は「戻り値=-1」となります。

 

今回デバイスに対して電気的なノイズがかかり、そのデバイスが瞬断(OSレベルで切断→再接続)しました。

その結果、「戻り値=0」になり続ける現象となりました。

これにより無限ループすることになりました。

 

 

このプログラムの欠陥は、

設計時にfuncBの戻り値が「0」になり続けるという想定が出来なかった事にあります。

 

対策としては、

funcBの「戻り値=0」が5回続けば、ループを抜けるという処理に変更しています。

 

 

一番伝えたい事

無限ループを使用する場合は、本当に無限で良いのかを検討すべきです。今回のような通常処理がループから抜けることを前提としている場合において、無限ループにする必要があるのかという点を考慮して設計するべきです。

 

 

いかがでしょうか。今回は自身がハマったコードについて紹介しました。またこのシリーズの紹介もしていきますね^^v

 

ではまた次回お会いしましょう♪