バグ検出ドリル(16)音楽プレーヤーに潜むバグを見つけ出せ山浦恒央の“くみこみ”な話(116)(3/3 ページ)

» 2019年03月25日 10時00分 公開
前のページへ 1|2|3       

4.今回の解答

 再生モードで再生指令を出して、一時停止モードに遷移できないのは、「正しく代入処理をしていない」ためです。

 問題を簡単に振り返りましょう。このプログラムは、ユーザーのコンソール入力に従って、モード遷移をする仕様です。リスト2の実行結果は、次のような手順でモード遷移をしています。

  • ①電源OFFモードで、「0(電源ON/OFF指令)」を入力、Enterを押し、アイドルモードに遷移する
  • ②アイドルモードで、「1(再生指令)」を入力、Enterを押し、再生モードに遷移する
  • ③再生モードで、「2(停止指令)」を入力、Enterを押し、アイドルモードに遷移する
  • ④アイドルモードで、「1(再生指令)」を入力、Enterを押し、再生モードに遷移する
  • ⑤再生モードで、「1(再生指令)」を入力、Enterを押し、一時停止モードに遷移するはずが、再生モードのままとなっている
  • ⑥コンソールから入力をせず、Ctrl+cでプログラムを終了する

 本来、再生モードで再生指令を出すと一時停止になるのですが、再生モードのままです。なぜでしょうか。バグは、以下の黄色で示した部分のソースコードにあります。

リスト1-2から再掲 リスト1-2から再掲

 黄色で示したソースコードでは、正しい代入処理ができていません。「gMode==MODE_PAUSE;」と書いてあり、値が代入できていません。正しくは、「gMode=MODE_PAUSE;」です。結果として、モードは再生モードのままとなりました。「=」と「==」の書き間違いは非常に多い上に、脳内では無意識に正しく読んでしまうため、なかなか気が付きません。厄介なバグですね。

 このバグは、昔、筆者が作り込んだものです。ループの中でモードが変わるプログラムだったのですが、フラグを立ててもモードが変化しません。原因が全く分からず、最後には、「コンピュータが壊れているのではないか?」と疑ったりしました。お恥ずかしい限りです。デバッガを使って、やっとバグに気付きました。

5.自己採点シート

 今回の自己採点シートを以下に示します。

問題 内容 配点(点)
音楽プレーヤープログラム 問題を一通り読んだ 50
正しく代入処理をしていないバグを見つけた 50
リスト3 自己採点シート

6.終わりに

 プログラムを思い通りに作ることは簡単ではなく、皆さんも毎日、悪戦苦闘していると思います。今回は、音楽プレーヤーのプログラムを出題しました。皆さんならこんな初歩的なバグを作らないでしょうが、「終わるはずのループが終わらない」という不可解な現象に遭遇したら、まずは、単純な記述ミスを疑ってください。

 組み込みソフトウェアでは、今回のような「モード」に着目すると、実装やテストが楽になることがあります。実装する前に、簡単な状態遷移図を作成すると、より良いソフト開発が可能となるでしょう。

参考文献

「モダンC言語プログラミング」(花井志生、2013年、KADOKAWA/アスキー・メディアワークス)

【 筆者紹介 】
山浦 恒央(やまうら つねお)

東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)


1977年、日立ソフトウェアエンジニアリングに入社、2006年より、東海大学情報理工学部ソフトウェア開発工学科助教授、2007年より、同大学大学院組込み技術研究科准教授、2016年より非常勤講師。

主な著書・訳書は、「Advances in Computers」 (Academic Press社、共著)、「ピープルウエア 第2版」「ソフトウェアテスト技法」「実践的プログラムテスト入門」「デスマーチ 第2版」「ソフトウエア開発プロフェッショナル」(以上、日経BP社、共訳)、「ソフトウエア開発 55の真実と10のウソ」「初めて学ぶソフトウエアメトリクス」(以上、日経BP社、翻訳)。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.