バグ検出ドリル(12)コンパイルエラーにならないコンパイルエラー山浦恒央の“くみこみ”な話(112)(3/3 ページ)

» 2018年11月21日 10時00分 公開
前のページへ 1|2|3       

4.今回の解答

 今回の解答は、以下の通りです。

(1)コンパイル系のバグ

 今回の「主役」が、「コンパイルエラーにならないコンパイルエラー」という以下のバグです。

  1. 「scanf("%d",time);」の&が抜けている
  2. 「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の入力パターン以外は考慮しないこと」と書いてありますので、バグと断定するには微妙ですが。

  1. 通常勤務と深夜勤務が何時からか指定がない
  2. 勤務時間帯として「2」を入力してもエラーにならない

1.通常勤務と深夜勤務が何時からか指定がない

 通常時間帯から深夜時間帯へ連続して勤務する場合、このプログラムでは2回に分けて入力し、手計算で両方を足さないと、正しい給与は計算できません。

2.勤務時間帯として「2」を入力してもエラーにならない

 プログラムのif文では、勤務時間帯が通常勤務(0)以外は、深夜勤務にしています。「2」を入力した場合、本来は、エラーメッセージを表示して、再入力させるべきですね。

5.自己採点シート

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

問題 内容 配点(点)
給与計算プログラム 問題文を一通り読んだ 10
ソースコードを一通り読んだ 20
デバッグをした 20
「scanf("%d",time);」の&が抜けているバグを見つけた 20
「if (zone = 0) {」が「==」となっていないバグを見つけた 20
処理系のバグも見つけた 10
リスト4 自己採点シート

6.終わりに

 今回は、コンパイルエラーにならないけど、意図しない動作をする問題を出題しました。一見、正しくコンパイルできてしまうので、タチの悪いバグです。皆さんも、長い経験の中で、今回のような記述ミスによるバグに手間取った経験をお持ちかと思います。このようなバグは、開発のデバッグ工程で見つかることが多く、大事にはならないでしょうが、注意深い記述を心掛けましょう。

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

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


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

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


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.