クローズアップ現代「ソフトウエア危機〜誤作動相次ぐハイテク製品〜」

 今日のクロ現は、去年起きた自動改札のトラブルに絡めてプログラミング業界の人不足がテーマでした。

 この障害の原因については「データ分割時のバグ」と報道されています。

 で、今日の放送中に原因箇所のコードが出てきました。

 この104行目の箇所です。
 修正後がこちら。

 つまり「+offset」が抜けていたのが原因とのことでした(放送では「抜けていただけでした」とか言われてた(汗)。全国のプログラマーはこのちょっとしたミスをいつかしてしまうんじゃしてしまったんじゃないかと怯えながら日々の激務をこなしているというのに!!)。

	// 誤
	wsize = (size + 3 ) / 4;
	// 正
	wsize = (size + offset + 3 ) / 4;


 この箇所の前にoffset変数を使用している箇所があります。

	/* 書き込むデータ作成 */
	memset((char*)cash, 0xFF, FMC_BK0_WORD_SIZE);
	bcopy((char*)target, (char*)&cash[offset], size);
// ( 引用者注:映像がぼけていたためbcopy()の第3引数がsizeかどうかは不明)


 targetに入ってるデータをcashにコピーする際、offset分だけずらしてコピーしています。
 おそらく、あとでcashの中身を他の場所にwsize分コピーする時に、wsizeをoffset分増やさないとcashにコピーしたtargetの中身がコピーされないんでしょう。
 この部分だけだと「データ分割」がどう絡んでくるかは分からないかな。データ分割時にsizeやoffsetの中身が変わるのか、データ分割時以外はoffset分増やさなくてもコピーされるのか、それともデータ分割時しかここが呼ばれないのか……。


 まぁプログラム組む上でこういうミスは十分あり得るから、テストの方が不完全だったってことだろうなぁ。不具合が見つかるケースは「紛失カード」の累積件数が5452-5457、5537-5542、5622-5627の場合とのことなので、仕様をちゃんと洗い出せて限界値分析ができてれば見つかっていたんだろうけど。放送を見る限りバグは自動改札機側にあったわけだから、理想を言えばサーバーを作ったとこが完全なテスト項目と環境を用意すれば……。


 おまけ。
 「問題のない箇所」のコードも放送されていたのでちょっと継ないでみた(放送時は上から下までスクロールしています)。
 *pCmdAddrへの代入や#if - #endifでデバッグコード囲んでいる所とかなかなか面白い(汗)。