金曜日, 7月 31, 2009

【プログラマ向け】これはタイプミスじゃなくてバグだよね...

CNET-JAPANにIEのzero-day脆弱性に対するMSの見解が載ってた。

元記事(アーカイブ)

概ね、担当者の言っていることは合っている。
だが、根本のバグ。&が付いていたのがタイプミスだというのは

おそらく全プログラマ(ただしC経験者)が否定できる内容であろう。

__int64 cbSize;
hr = pStream->Read((void*) &cbSize, sizeof(cbSize), NULL);
BYTE *pbArray;
HRESULT hr = SafeArrayAccessData(psa, reinterpret_cast(&pbArray));
hr = pStream->Read((void*)&pbArray, (ULONG)cbSize, NULL);
これが、この記事に書いてあるバグのサンプルコードなのだが。
まともなプログラマであれば、きっとこんな設計をしたら怒る。
  • 多重ポインタの多用はバグの元
  • データの受け渡しで(void*)はよろしくない
  • そもそも、キャストを多用するプログラムは書くべきではない
多分まだまだある。
そんな例を如何にも「ほら見付けにくいだろ」と出すマイクロソフトさん。
はっきり言うけど、これはポインタを理解してないプログラマが設計したと自白しているような物だ。
つまりこの元コードを書いた人間はここ一つのミスでは飽き足らないはずである。

特に「タイプミス」とか言っているうちは。


僕は仕事ではマイクロソフトユーザである。

だから切に願う。これが、たんなる「大変だったんだよ」というパフォーマンスで
マイクロソフトは、キッチリと反省しており、こんな設計を許さない企業であることを。


written by BeepCap

2 件のコメント:

Unknown さんのコメント...

それはそもそもposixのfreadの
インターフェースがマズいって話にならないかな?

int fread(void*,int,int,int);

じゃんか。
そしたらそこはもう、MSの管轄ではないべ。

void*に対してBYTE*を渡すとC++コンパイラなら
キャストしない限り怒られてしまうのだし、
リフレクションかシリアライザを使う以外に解決はないでしょ。

BeepCap さんのコメント...

むむむ...
確かに、freadの仕様がという話になってしまいますな。
といって、あっちは型を意識せずに保存しようという意図だし...

しかし、これをtypoだと言い張るのもどうなのかなという疑惑が拭えない。

決してマイクロソフトだからどうのという話ではなくて。

自己紹介

自分の写真
NetRadioDJ ...since 2003, Programer ...since 1994