C/C++ の話です。
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;
↑これは、↓こんな風に確保します。
(BITMAPINFO *) new BYTE[sizeof(BITMAPINFO) + sizeof(RGBQUAD) * 256];
こうすると、bmiColors は、添え字が1と宣言されていますが、255までは、確保した範囲内です。
でもね。
静的コード解析ツールは、そんなところまでは解析してくれないんですね。で、使っているところで「おいおい、配列の添え字をオーバーしちゃってるよ。このままだとバッファオーバーフローをおこすよ。」と、警告してくれます。
その警告を見て、宣言を見て「あれ?1しかあらへんやん」と、使っているところを全部(ツールが指摘してくれるから楽)「0までしかアクセスしない」ように変更してくれちゃった人がいるのよぉぉぉぉぃぉぃぉぃ orz
いや、もう、なんて言うか。参りました。。。初期化するのに 256 回まわしていたのを、1 回しかまわらないようにしちゃってたのよね。そんなもんだから、真っ白け。。。なんのためにそうなっているのか、ちっとは考えてくらはい。直すのは簡単なんだけど、テストがたいへんなんだよぉぉぉぉぉぃぉぃorz
私は、「別に配列だろうがポインタだろうが、使えたらええねん」(参照:「Cのポインタで躓く人が多いが、Javaの参照で躓く人が少ない理由」(凪瀬 Blog))な人なので、「RGBQUAD* でええやん。。。」とか思っちゃうんですよねぇ。。。あきませんか?(上記の初期化方法じゃ、アクセスできないけどね)
投稿日時 : 2007年12月7日 22:44