nodocumentsの日記: 久々の味わい 4
日記 by
nodocuments
新しくもらったソースからビルドしたDLLが不意に落ちるようになったのでバグ探し
return で落ちるのでスタック破壊と目星をつけ、歩哨変数を立てて値の破壊を監視
バッファオーバーランの発生箇所を特定して報告、終了
スタック破壊とかバッファオーバーランとか、久々にC++らしいバグを味わえて満足w
新しくもらったソースからビルドしたDLLが不意に落ちるようになったのでバグ探し
return で落ちるのでスタック破壊と目星をつけ、歩哨変数を立てて値の破壊を監視
バッファオーバーランの発生箇所を特定して報告、終了
スタック破壊とかバッファオーバーランとか、久々にC++らしいバグを味わえて満足w
ナニゲにアレゲなのは、ナニゲなアレゲ -- アレゲ研究家
もし良かったら教えてもらえませんでしょうか (スコア:0)
最近さっぱりプログラミングしていない元プログラマで、歩哨変数という言葉に興味を持ちました。
スタック上に入っているリターンアドレスのすぐ上(あいまいな表現ですがわかってもらえることを期待)に歩哨変数を置くためにはどうしたらいいのでしょうか?
問題の関数の最初に置かれた初期化されたローカル変数だとスタック上の期待した位置に置いてくれるのかとも思ったけど下手に最適化されてレジスタになってたりすると困るから配列にしておく感じでしょうか?
あとはデバッガで歩哨変数への書き込みをブレークポイントとして実行してPCから犯人探し。
Re: (スコア:0)
・最適化off(-G0)にする
・歩哨変数をvolatileにしておく
あたりかなあ?
最近のコンパイラはセキュリティ対策でスタックフレームまで
いじる場合もあるからこれだけでいけるかは知らんけど。
Re: (スコア:0)
この種のバグだと最適化オプションの有無で動作が変わることもあるんだよなあ
(それこそスタックフレーム上に確保される変数が増えることで破壊されていたものがされなくなったとか)
Re: (スコア:0)
ありがとうございます。
K&R時代でやめてしまったのでvolatileは知らなかったのですか納得なものです。
最適化禁止は挙動が変わりそうだと別の方が指摘されてますがコストが低いなら
ダメもとで一回試してみるのもありかなあ。