2009/07/31(金)Microsoft の『ATL』のコードに不具合、原因は「&」(japan.internet.com)

2009/07/31 24:59

http://japan.internet.com/webtech/20090731/12.html

プログラミングの経験のない方は、「たった1文字間違えただけか」という印象を抱くかもしれませんが、間違えた場所をよく見てみると、わりととんでもない間違いをしています。

具体的には

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

と書かれるべきコードが、

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

と誤って書かれていた。

Microsoft の『ATL』のコードに不具合、原因は「&」

pStreamがどんなオブジェクトなのか、Read()がどんなメンバ関数なのかははっきりは分かりませんが、おそらくpStreamの入力ストリームからcbSizeのサイズ分だけ読み取り、結果をpbArrayの指し示す先の配列に書き込むといった処理だと思います。

各変数にはプリフィックスがついていますが、悪名高きシステムハンガリアンではなく、アプリケーションハンガリアンでしょう。pbArrayがboolへのポインタだとは思えないので。おそらくcbはCount of Byteで、pbはPointer of Byteといったところでしょうか。

ハンガリアン記法を使うこと自体は問題ありません。問題は、せっかくプリフィックスをつけたというのに、それを全く活かせていないことです。

書き込む先のアドレスを渡さなければいけない場所で、なぜpbArrayそのものではなく、pbArrayのアドレスを渡すようなコードを書いてしまったのか。作業者は「pb」の文字が目に入らなかったのか。まぁ、おそらく作業者が疲れていたんでしょうけど、せっかくのプリフィックスを妥当性チェックのために使用しないのであれば、タイピング数を増やすだけのルールはやめてしまえばいいのにと思います。

というか、こういうミスが出てくるとハンガリアン記法不要論に勢いを与えてしまうんだよなぁ *1 。困ったものです。

*1:もちろん、私もシステムハンガリアンにはあまり意味があるとは思っていません。必要だと思っているのはアプリケーションハンガリアンです。