パスワードを忘れた? アカウント作成
16735031 journal
日記

nodocumentsの日記: 久々の味わい 4

日記 by nodocuments

新しくもらったソースからビルドしたDLLが不意に落ちるようになったのでバグ探し
return で落ちるのでスタック破壊と目星をつけ、歩哨変数を立てて値の破壊を監視
バッファオーバーランの発生箇所を特定して報告、終了

スタック破壊とかバッファオーバーランとか、久々にC++らしいバグを味わえて満足w

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2023年08月25日 21時10分 (#4517229)

    最近さっぱりプログラミングしていない元プログラマで、歩哨変数という言葉に興味を持ちました。

    スタック上に入っているリターンアドレスのすぐ上(あいまいな表現ですがわかってもらえることを期待)に歩哨変数を置くためにはどうしたらいいのでしょうか?

    問題の関数の最初に置かれた初期化されたローカル変数だとスタック上の期待した位置に置いてくれるのかとも思ったけど下手に最適化されてレジスタになってたりすると困るから配列にしておく感じでしょうか?

    あとはデバッガで歩哨変数への書き込みをブレークポイントとして実行してPCから犯人探し。

    • by Anonymous Coward

      ・最適化off(-G0)にする
      ・歩哨変数をvolatileにしておく
      あたりかなあ?
      最近のコンパイラはセキュリティ対策でスタックフレームまで
      いじる場合もあるからこれだけでいけるかは知らんけど。

      • by Anonymous Coward

        この種のバグだと最適化オプションの有無で動作が変わることもあるんだよなあ
        (それこそスタックフレーム上に確保される変数が増えることで破壊されていたものがされなくなったとか)

      • by Anonymous Coward

        ありがとうございます。
        K&R時代でやめてしまったのでvolatileは知らなかったのですか納得なものです。
        最適化禁止は挙動が変わりそうだと別の方が指摘されてますがコストが低いなら
        ダメもとで一回試してみるのもありかなあ。

typodupeerror

最初のバージョンは常に打ち捨てられる。

読み込み中...