バグ検出ドリル(17)「よくある単純なバグ」だからこそ見つけにくい山浦恒央の“くみこみ”な話(117)(3/3 ページ)

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

5.今回の解答

 原因は、「breakが抜けている」でした。

 問題を振り返ります。ユーザーは、以下の手順で入力しています。

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

 本来、再生モードで再生指令を入力すると一時停止になるのですが、再生モードのままです。なぜでしょうか。原因は以下の場所にあります。

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

 上記の「// アイドルモードの場合」の真上をご覧ください。再生モードのswitch-caseにbreakが抜けていますね。switch文にbreakが無い場合は、下の条件文も実行します。その結果、再生モードで「一時停止モード」に遷移しても、アイドルモードで「再生モード」に遷移してしまいます(黄色で示した部分を参照)。

 switch文を使用する場合は、一般的にcaseとbreakをセットにして記述します※2)。breakを記述しない場合は、次のcaseを実行してしまうため、正しい処理が出来ません。

※2)プログラマーによっては、わざとbreakを記述しないで処理をする場合もあります。

 「==」やswitch-caseのバグを防ぐためには、デバッグ時にしっかり確認しておくか、違う実装方法に変更するとよいかと思います。たかが「break」の記述ミスですが、ミスなくプログラムをするのは簡単ではありませんね。

6.自己採点シート

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

問題 内容 配点(点)
音楽プレーヤープログラム 問題を一通り読んだ 50
switch文にbreakが抜けていることを見つけた 50
リスト3 自己採点シート

7.終わりに

 プログラムは考えた通りに動くのではなく、作った通りに動きます。プログラマーは、毎日、このギャップに悪戦苦闘しているはずです。今回は、前回に引き続き、音楽プレーヤーのプログラムを出題しました。Breakの抜けは初歩的なバグですが、「よくある単純バグ」として有名ですね。皆さんは、こんなバグを作らないと思いますが、保守で他人のプログラムに手を入れる場合、switch-caseを見たら、breakがちゃんとあるか、ぜひ、確認してください。

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

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


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

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


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.