バグ検出ドリル(17)「よくある単純なバグ」だからこそ見つけにくい:山浦恒央の“くみこみ”な話(117)(3/3 ページ)
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第17回の問題は、前回と同じ音楽プレーヤーのプログラムから出題します。「よくある単純なバグ」が潜んでいますが、見つけ出せますか?
5.今回の解答
原因は、「breakが抜けている」でした。
問題を振り返ります。ユーザーは、以下の手順で入力しています。
- ①電源OFFモードで、「0(電源ON/OFF指令)」を入力、Enterを押し、アイドルモードに遷移する
- ②アイドルモードで、「1(再生指令)」を入力、Enterを押し、再生モードに遷移する
- ③再生モードで、「2(停止指令)」を入力、Enterを押し、アイドルモードに遷移する
- ④アイドルモードで、「1(再生指令)」を入力、Enterを押し、再生モードに遷移する
- ⑤再生モードで、「1(再生指令)」を入力、Enterを押し、一時停止モードに遷移するはずが、再生モードのままとなっている
- ⑥コンソールから入力をせず、Ctrl+cでプログラムを終了する
本来、再生モードで再生指令を入力すると一時停止になるのですが、再生モードのままです。なぜでしょうか。原因は以下の場所にあります。
上記の「// アイドルモードの場合」の真上をご覧ください。再生モードの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がちゃんとあるか、ぜひ、確認してください。
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
関連記事
- ≫連載「山浦恒央の“くみこみ”な話」バックナンバー
- バグ検出ドリル(16)音楽プレーヤーに潜むバグを見つけ出せ
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第16回の問題は「簡単なバグなのに、なかなか見つからない」バグです。何で見つからないんだ! - バグ検出ドリル(15)なぜ「山田三郎」が「まだまだ天田三郎」に化けるのか
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第15回の問題は、「思った通りに動いてくれないプログラム」のバグです。少しはプログラマーに忖度してくれよ! - バグ検出ドリル(14)タイポグリセミア現象もびっくり、恐るべきは思い込み
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第14回の問題は、前回に続いて「煮詰まったバグ」です。煮詰まっているがゆえに、バグの原因が分からなくなる事態に対処してください! - バグ検出ドリル(13)のたうち回る地獄、煮詰まったバグを解決せよ
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第13回の問題は、筆者の経験を基にして作った「煮詰まったバグ」です。プログラムが思い通りに動かず「のたうち回る地獄」のような状況に対処してください! - バグ検出ドリル(12)コンパイルエラーにならないコンパイルエラー
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第12回は、前回に引き続き「コンパイルエラー」がテーマです。コンパイルエラーにはならないのに、うまく動かないプログラムのバグを見つけ出してください!
Copyright © ITmedia, Inc. All Rights Reserved.