連載
» 2017年12月15日 10時00分 公開

山浦恒央の“くみこみ”な話(101):バグ検出ドリル(1)「さあ、バグを見つけよう」 (1/4)

記念すべき連載第100回を突破した「山浦恒央の“くみこみ”な話」。今回の第101回からは、新シリーズ「バグ検出ドリル」が始まります。山浦氏が出題する問題に取り組んで、バグを見つけ出す力を養おう!

[山浦恒央 東海大学 大学院 組込み技術研究科 非常勤講師(工学博士),MONOist]

1.はじめに

超大規模書店 ※写真はイメージです

 筆者が学生の頃、5階建ての超大規模書店へ行っても、コンピュータ関係の書籍は20冊ほど。横幅1mの本棚が1段あれば十分収まりました。当時の情報処理関係への関心は信じられないほど低く、「諜報スパイ活動」の書籍コーナーに「情報処理技術者」の受験対策本が並んでいて、「コンピュータ系の学問は、まだ夜明け前だ」と悲しくなったことを覚えています。

 今では、小規模書店でも、棚全面にコンピュータ系の書籍がぎっしり並んでいることも当たり前になりました。特に多いのがCやC++のようなプログラミング言語の習熟本です。文法や簡単なコーディングが載っている本で、中には、「空白の行に適切な命令語を埋めなさい」のような問題集が付いているものもあります。

 筆者がいつも不思議に思うのは、「コーディングの問題集はあるのに、なぜ、デバッグの問題集はないのだろう?」です。数行で書いたプログラムの仕様と、それに対応するソースコードが20〜100行程度提示してあり、仕様書やソースコードのバグを見つける問題集は、ありそうでありません。今回は、そんな「バグ検出ドリル」シリーズの第1弾です。

2.問題集の構成

 バグは、ソフトウェアのあらゆる開発物に潜んでおり、エンジニアは素早くバグを検知する能力が必要です。新シリーズは、エンジニアのバグ検知能力の向上を目的に、バグ入り問題を出題し、読者に見つけてもらうことが狙いです。

 主な流れとしては、まず筆者がバグ入りの仕様やプログラムを提示します。読者はレビュー担当者になって、バグを見つけてください。継続して問題を解くと、「この辺りにバグがありそうだ」とバグの匂いを感じるはずです。また、問題の中には、筆者が想定していないバグがあるかもしれませんので、併せてお考えください(バグは、ソースコードだけでなく、仕様書の中にもあります)。

 筆者の意図しない箇所は、あらかじめ制限事項をつけます。その部分は、問題があっても無視してください。コラムの最後に、想定した解答例と自己採点シートを提示します。自分で点数をチェックしてください。点数は、筆者が独断と偏見で決めたので、点数を気にせず、小学校の算数ドリルくらい気楽に試してください。

3.今回の問題

 今回は2問出題します。問題1は以下の通りです。

問題1:リスト1-1に仕様、リスト1-2にデータ、リスト1-3にプログラムを示す。リスト1-4の制限事項を順守し、バグを検出せよ。バグは1つとは限らない。

仕様:本プログラムは、5人分の国語テストの点数から平均点を求め、コンソールに表示するプログラムである。

 5人分の国語の点数の平均点を整数型(int型)で算出する。なお、使用するデータは、リスト1-2を参照すること。また、平均点は、コンソールに整数型(int型)で表示すること。

リスト1-1:平均値を求めるプログラムの仕様
生徒 国語の点数
A 70
B 83
C 100
D 33
E 89
リスト1-2 国語の点数データ
#include <stdio.h>
int main() {
	int i;
	int avg;
	int num[5] = {70, 83, 100, 33, 89};
	for (i = 0; i < 4; i++) {
		avg += num[i];
	}
	avg /= 5;
	printf("平均 = %d\n",avg);
	return 0;
}
リスト1-3 平均値を求めるプログラム

(※)使用する変数は、全て整数型を使用し、5人分の点数データ(変数num[5])は、ハードコーディングとする。

リスト1-4 制限事項

解説

 リスト1-1は、平均値を求める仕様で、リスト1-2のデータを使って算出します。リスト1-3は、1-1、1-2を基にしたC言語で記述したプログラムです。なお、点数のデータは、ハードコーディングしています(良い子は、まねをしてはいけません)。まずは、仕様とプログラムを3分眺めてみてください。おかしいことに気付くはずです。

       1|2|3|4 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.