日経コンピュータ 首都圏自動改札トラブルの原因特定

記事によると、特定の長さのファイルを読み込んだ時に起こるトラブルだったそうです。
記事がネットに上がっているか探したけれど見つからなかった。
なんかそんなバグ俺も仕込んだことがあるなぁ…。
うろ覚えの言語でコードを書いてみる。




eof_flag := '0';
i := 1;
work_file := source_file;
while eof_flag = '0' loop
if lengthb(work_file) > 10000 then
i := i + 1;
current_file := substrb(work_file,1,10000);
else
current_file := work_file;
end if;
if lengthb(current_file) < 10000 then
eof_flg := '1';
end if;
current_file を使った処理
if lengthb(current_file) < 10000 then
null;
else
work_file := substrb(work_file,10001,lengthb(work_file) - 10000);
end loop;




あってるかな??たぶん文法間違っていると思うからこのままじゃ使えねぇな。source_fileを10000バイトごとに分割して処理したいってだけのロジック。


このソースコードの問題点はここだけ

  • if lengthb(current_file) < 10000 then

「<」じゃだめで「<=」が正解。これだと無限ループするはず。
このパターンだとすぐにループするからわかるんだけれど時限爆弾みたいにちょうどあるサイズにならなきゃ発動しないバグってのもあるんですよね。それが仕様に上がっていればテスト項目にもなるけれど、内部ロジックの効率化とかパフォーマンス対策でやっていたら組んだプログラマー以外にはそんなテストケース作れない。


あーあ。ちゃんととある長さの時だけバグるコード書けると思ったのになぁ。めんどくさいからもうやめた…。バグをわざと仕込むのは面倒なのに天然だとどうして簡単に出来るのかと…。