元記事(アーカイブ)
概ね、担当者の言っていることは合っている。
だが、根本のバグ。&が付いていたのがタイプミスだというのは
おそらく全プログラマ(ただし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 件のコメント:
それはそもそもposixのfreadの
インターフェースがマズいって話にならないかな?
int fread(void*,int,int,int);
じゃんか。
そしたらそこはもう、MSの管轄ではないべ。
void*に対してBYTE*を渡すとC++コンパイラなら
キャストしない限り怒られてしまうのだし、
リフレクションかシリアライザを使う以外に解決はないでしょ。
むむむ...
確かに、freadの仕様がという話になってしまいますな。
といって、あっちは型を意識せずに保存しようという意図だし...
しかし、これをtypoだと言い張るのもどうなのかなという疑惑が拭えない。
決してマイクロソフトだからどうのという話ではなくて。
コメントを投稿