Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

本日見かけた酷いコード10

タグ: C++ 酷いコード

バグ探しを手伝って欲しいと言われた。
色々調べて落ちる場所の特定まではできた(デバッグ実行もバックトレースも不可らしい)が、その原因がどうしても分からないのだという。
さっそく、その落ちる場所とやらを見せてもらう。

  1. printf (落ちる位置を特定するために追加)
  2. ローカル変数 hoge.m_type に定数(4)を代入
  3. printf (落ちる位置を特定するために追加)

最初の printf の出力は表示されるが、後ろの printf の出力は表示されず、「アドレス 0x00000004 で Access Violation」という例外が発生する。
だから怪しいのはこの2つの printf の間にある処理。

確かにその説はごもっとも。
だがそこにある処理は、どう考えても Access Violation するようなものではない。

hoge.m_type = 4;

hoge が参照だったり、非PODだったりしたら分かるが、これは間違いなくPODのスタック変数。
ただの代入文で落ちるはずはない。

0x00000004 という微妙なアドレスも気になる。
NULL + vfptr ……はPODだからないか。
NULL + メンバ変数アドレス ……も、メンバ変数が構造体の先頭メンバだから、 0x00000000 になるはず。

結論:代入文では落ちない

と、なると。
私は後ろの printf を見る。

printf("[Debug] type:%s", hoge.m_type);

%sに hoge.m_type (=0x00000004) か……
そりゃあ、落ちるよね!(・∀・)

でもまあ、こういうのはよくある。
printf の引数を間違えることも、デバッグ用のコードが悪さをすることも。
ついこの前も、デバッグメッセージを表示する関数が、 WaitForSingleObject 中のスレッドに SendMessage してデッドロックを引き起こしているのを見つけたし。
でもって、こういうのはなかなか対策できないんだよねぇ……

スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/109-8fa159c3
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。