何となく Blog by Jitta
Microsoft .NET 考

目次

Blog 利用状況
  • 投稿数 - 761
  • 記事 - 18
  • コメント - 36161
  • トラックバック - 222
ニュース
  • IE7以前では、表示がおかしい。div の解釈に問題があるようだ。
    IE8の場合は、「互換」表示を OFF にしてください。
  • 検索エンジンで来られた方へ:
    お望みの情報は見つかりましたか? よろしければ、コメント欄にどのような情報を探していたのか、ご記入ください。
It's ME!
  • はなおか じった
  • 世界遺産の近くに住んでます。
  • Microsoft MVP for Visual Developer ASP/ASP.NET 10, 2004 - 9, 2011
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

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
コメント
  • # re: 配列の添え字
    シャノン
    Posted @ 2007/12/07 22:48
    ポインタだと、
    ・一続きの領域に確保される保証がない
    ・そのままファイルに落とせない
    という問題があるのかと。
    特にDIBみたいなやつは。
  • # re: 配列の添え字
    Jitta
    Posted @ 2007/12/07 23:00
    シャノンさん、お早いコメントありがとうございます。

    > ・一続きの領域に確保される保証がない
    これは、取り方次第かと。えと、前にプリンタ関係の構造体について、ちゃっぴさんが調べてくださったとおり。

    # つか、「C のポインタ、万能過ぎ」って事なのかも?
  • # re: 配列の添え字
    774RR
    Posted @ 2007/12/07 23:07
    C99 にして bmiColors[] とするのが適切ね
    静的解析ツールが対応しているかどうかは別問題だがな!
  • # re: 配列の添え字
    Jitta
    Posted @ 2007/12/07 23:23
    774RRさん、コメントありがとうございます。お待ちしておりました。

    > bmiColors[] とするのが適切ね
    添え字は宣言しないと。なるほど。
    Platform SDK で用意されているものなので、対応していてほしいのはコンパイラのほうかも?
  • # re: 配列の添え字
    RUN
    Posted @ 2007/12/07 23:23
    静的コード解析か~
    妙な信奉を持った現場とかありますね。
    今いるところがそんな感じですが、
    静的コード解析に引っかかる物は(理由の如何関係なく)全てNG。
    静的コード解析でOK出ればどんな事しててもOK。

    おかげで、静的解析で問題がでても、根本的な問題解決のされない解析がOKになるだけのコードが量産されていたり。
    使いたいロジックが引っかかって、苦肉の策でお行儀の悪目なコードをとなってしまったりと、かなり厳しいです
  • # re: 配列の添え字
    Jitta
    Posted @ 2007/12/07 23:24
    あ、今日は別のところで ANYSZE_ARRAY なんて添え字を見たんだ。
    そいつを調べると、#define ANYSIZE_ARRAY 1 とか、宣言されていたんだ。。。
  • # re: 配列の添え字
    774RR
    Posted @ 2007/12/08 0:11
    うちの上司の上司がどこで聞きつけてきたのか、まさにその
    静的解析でOKなら・・・と言い出したのですよ。
    なんかいやな方向に行きそうだったので止めますた。
    RUN氏<ご愁傷様です
  • # re: 配列の添え字
    Jitta
    Posted @ 2007/12/08 14:22
    ご愁傷様
    case の break なしなんて、意図してやっていることがあるですよ。それまで否定されるとキビシぃ~!!
タイトル
名前
Url
コメント