バグ検出ドリル(12)コンパイルエラーにならないコンパイルエラー:山浦恒央の“くみこみ”な話(112)(3/3 ページ)
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第12回は、前回に引き続き「コンパイルエラー」がテーマです。コンパイルエラーにはならないのに、うまく動かないプログラムのバグを見つけ出してください!
4.今回の解答
今回の解答は、以下の通りです。
(1)コンパイル系のバグ
今回の「主役」が、「コンパイルエラーにならないコンパイルエラー」という以下のバグです。
- 「scanf("%d",time);」の&が抜けている
- 「if (zone = 0) {」が「==」となっていない
1.「scanf("%d",time);」の&が抜けている
scanf関数は、「&」の付け忘れが頻発することで有名な関数です。本問題でも、&の付け忘れによって、プログラムがハングアップしてしまいました。scanf関数は、実際の開発で使うことはほとんどないでしょうが、サンプルプログラムをコピーする際は、注意してください。なお、文字列として入力する場合、&は使いません。そんなこともあり、エラーメッセージは現れず、意図した通りの動作をしません。
2.「if (zone = 0) {」が「==」となっていない
scanfのバグを修正しても正しく動きません。if文の条件式が、「if (zone == 0)」となっていないため、通常勤務を入力しても、else以下を実行します。「if (zone = 0)」では、zone=0に代入した後、式を評価します。if文は、条件式が0の場合は偽、0以外は真となります。結果として、通常勤務を入力しても偽となりelse以下を実行します。今回のように、通常勤務と深夜勤務の判定に使う場合は、「==」としましょう。
(2)処理系のバグ
「主役的バグ」ではありませんが、処理内容に違和感のある箇所があります。問題文で、「なお、本問題では、リスト2の入力パターン以外は考慮しないこと」と書いてありますので、バグと断定するには微妙ですが。
- 通常勤務と深夜勤務が何時からか指定がない
- 勤務時間帯として「2」を入力してもエラーにならない
1.通常勤務と深夜勤務が何時からか指定がない
通常時間帯から深夜時間帯へ連続して勤務する場合、このプログラムでは2回に分けて入力し、手計算で両方を足さないと、正しい給与は計算できません。
2.勤務時間帯として「2」を入力してもエラーにならない
プログラムのif文では、勤務時間帯が通常勤務(0)以外は、深夜勤務にしています。「2」を入力した場合、本来は、エラーメッセージを表示して、再入力させるべきですね。
5.自己採点シート
今回の自己採点シートを以下に示します。
問題 | 内容 | 配点(点) |
---|---|---|
給与計算プログラム | 問題文を一通り読んだ | 10 |
ソースコードを一通り読んだ | 20 | |
デバッグをした | 20 | |
「scanf("%d",time);」の&が抜けているバグを見つけた | 20 | |
「if (zone = 0) {」が「==」となっていないバグを見つけた | 20 | |
処理系のバグも見つけた | 10 | |
リスト4 自己採点シート |
6.終わりに
今回は、コンパイルエラーにならないけど、意図しない動作をする問題を出題しました。一見、正しくコンパイルできてしまうので、タチの悪いバグです。皆さんも、長い経験の中で、今回のような記述ミスによるバグに手間取った経験をお持ちかと思います。このようなバグは、開発のデバッグ工程で見つかることが多く、大事にはならないでしょうが、注意深い記述を心掛けましょう。
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「山浦恒央の“くみこみ”な話」バックナンバー
- バグ検出ドリル(11)コンパイルエラーは意外に難しい
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第11回では、初心者が苦労する「コンパイルエラー」がテーマです。コンパイラが指し示すエラーの箇所から、バグを見つけ出してください! - バグ検出ドリル(10)“昔のバグ”は生命力が最強
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第10回では、生命力最強という“昔のバグ”がテーマです。前回の第9回で扱った迷路探索プログラムの改造版からバグを見つけ出してください! - バグ検出ドリル(9)デバッグの基本的な心構えは「人を見たら泥棒と思え」
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第9回では、比較的大きなソースコードである迷路探索プログラムに潜むバグを見つけ出してください! - バグ検出ドリル(8)電卓プログラムのような小さなプログラムにもバグがいる
学生プログラミングの課題となるような小さいプログラムでもバグが潜んでいます。「バグ検出ドリル」の第8回では、学生が5分で書けるような電卓プログラムに潜むバグを見つけ出してください! - バグ検出ドリル(7)やっぱり、いろんなところにバグがいる!
重要顧客の前でデモを行う際にバグが発生すると大変です。顧客だけでなく、自社の社長まで同席していたいたときなどは、さらにものすごく焦るのではないでしょうか。「バグ検出ドリル」の第7回では、そんな状況を想定しつつ、いろんなところに潜むバグを見つけ出してください!