読者です 読者をやめる 読者になる 読者になる

プログラマyasuhoの隠れ家

某ソフトウェア企業に勤務するおじさんプログラマyasuhoです

これを見て思わず自分のコードを確認してしまった人の数 ->

 Howard氏はブログで、ハイテク版「ウォーリーをさがせ!」さながらに、読者が数行の短いコードの中からタイプミスを見つけられるかを試した。Howard氏は、タイプミスは1文字だというヒントまで出している。

 Howard氏が読者に提示したコードは、以下の通りだ。


__int64 cbSize;
hr = pStream->Read*1;
hr = pStream->Read((void*)&pbArray, (ULONG)cbSize, NULL);

 そして、Howard氏は読者に次のように出題した。「もう1つ手がかりをだそう。タイプミスは1文字だ。降参だろうか。では、最後の1行を見てもらいたい。最初の引数が間違っている。正しくは、『hr = pStream->Read((void*)pbArray, (ULONG)cbSize, NULL);』だ」(Howard氏)

「IE」に対する最新攻撃の原因、たった1つのタイプミス--MSが認める - CNET Japan


使い古されたフレーズだけどプログラミングに完璧はあり得ないという事実を再認識させられる事例。


個人的には、この場合の"Typo"はタイプミスというより「うっかりミス」の方が近いと思うけどね。:)


記事にあるように、この手のバグは発見が難しい。コードレビューでもテストでも簡単には見つからないだろう。しかもこの場合は事前のコーディングミス発見ツール*2まですり抜けてしまっている。


さらに悪いことに、この種のミスはとてもよく見かける。


やっぱり銀の弾丸なんて存在しないんだね。「どんなにテストしても、どんなにコードレビューをしても、安心しちゃいけないよ」っていうのが、このバグの教訓かなあ。


P.S.


記事の先のblogが、なかなか興味深いです。

*1:void*) &cbSize, sizeof(cbSize), NULL); BYTE *pbArray; HRESULT hr = SafeArrayAccessData(psa, reinterpret_cast(&pbArray

*2:PREfastのことだろうか