バグ検出ドリル(16)音楽プレーヤーに潜むバグを見つけ出せ:山浦恒央の“くみこみ”な話(116)(3/3 ページ)
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第16回の問題は「簡単なバグなのに、なかなか見つからない」バグです。何で見つからないんだ!
4.今回の解答
再生モードで再生指令を出して、一時停止モードに遷移できないのは、「正しく代入処理をしていない」ためです。
問題を簡単に振り返りましょう。このプログラムは、ユーザーのコンソール入力に従って、モード遷移をする仕様です。リスト2の実行結果は、次のような手順でモード遷移をしています。
- ①電源OFFモードで、「0(電源ON/OFF指令)」を入力、Enterを押し、アイドルモードに遷移する
- ②アイドルモードで、「1(再生指令)」を入力、Enterを押し、再生モードに遷移する
- ③再生モードで、「2(停止指令)」を入力、Enterを押し、アイドルモードに遷移する
- ④アイドルモードで、「1(再生指令)」を入力、Enterを押し、再生モードに遷移する
- ⑤再生モードで、「1(再生指令)」を入力、Enterを押し、一時停止モードに遷移するはずが、再生モードのままとなっている
- ⑥コンソールから入力をせず、Ctrl+cでプログラムを終了する
本来、再生モードで再生指令を出すと一時停止になるのですが、再生モードのままです。なぜでしょうか。バグは、以下の黄色で示した部分のソースコードにあります。
黄色で示したソースコードでは、正しい代入処理ができていません。「gMode==MODE_PAUSE;」と書いてあり、値が代入できていません。正しくは、「gMode=MODE_PAUSE;」です。結果として、モードは再生モードのままとなりました。「=」と「==」の書き間違いは非常に多い上に、脳内では無意識に正しく読んでしまうため、なかなか気が付きません。厄介なバグですね。
このバグは、昔、筆者が作り込んだものです。ループの中でモードが変わるプログラムだったのですが、フラグを立ててもモードが変化しません。原因が全く分からず、最後には、「コンピュータが壊れているのではないか?」と疑ったりしました。お恥ずかしい限りです。デバッガを使って、やっとバグに気付きました。
5.自己採点シート
今回の自己採点シートを以下に示します。
問題 | 内容 | 配点(点) |
---|---|---|
音楽プレーヤープログラム | 問題を一通り読んだ | 50 |
正しく代入処理をしていないバグを見つけた | 50 | |
リスト3 自己採点シート |
6.終わりに
プログラムを思い通りに作ることは簡単ではなく、皆さんも毎日、悪戦苦闘していると思います。今回は、音楽プレーヤーのプログラムを出題しました。皆さんならこんな初歩的なバグを作らないでしょうが、「終わるはずのループが終わらない」という不可解な現象に遭遇したら、まずは、単純な記述ミスを疑ってください。
組み込みソフトウェアでは、今回のような「モード」に着目すると、実装やテストが楽になることがあります。実装する前に、簡単な状態遷移図を作成すると、より良いソフト開発が可能となるでしょう。
参考文献
「モダンC言語プログラミング」(花井志生、2013年、KADOKAWA/アスキー・メディアワークス)
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「山浦恒央の“くみこみ”な話」バックナンバー
- バグ検出ドリル(15)なぜ「山田三郎」が「まだまだ天田三郎」に化けるのか
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第15回の問題は、「思った通りに動いてくれないプログラム」のバグです。少しはプログラマーに忖度してくれよ! - バグ検出ドリル(14)タイポグリセミア現象もびっくり、恐るべきは思い込み
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第14回の問題は、前回に続いて「煮詰まったバグ」です。煮詰まっているがゆえに、バグの原因が分からなくなる事態に対処してください! - バグ検出ドリル(13)のたうち回る地獄、煮詰まったバグを解決せよ
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第13回の問題は、筆者の経験を基にして作った「煮詰まったバグ」です。プログラムが思い通りに動かず「のたうち回る地獄」のような状況に対処してください! - バグ検出ドリル(12)コンパイルエラーにならないコンパイルエラー
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第12回は、前回に引き続き「コンパイルエラー」がテーマです。コンパイルエラーにはならないのに、うまく動かないプログラムのバグを見つけ出してください! - バグ検出ドリル(11)コンパイルエラーは意外に難しい
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第11回では、初心者が苦労する「コンパイルエラー」がテーマです。コンパイラが指し示すエラーの箇所から、バグを見つけ出してください!