アカウント名:
パスワード:
最近さっぱりプログラミングしていない元プログラマで、歩哨変数という言葉に興味を持ちました。
スタック上に入っているリターンアドレスのすぐ上(あいまいな表現ですがわかってもらえることを期待)に歩哨変数を置くためにはどうしたらいいのでしょうか?
問題の関数の最初に置かれた初期化されたローカル変数だとスタック上の期待した位置に置いてくれるのかとも思ったけど下手に最適化されてレジスタになってたりすると困るから配列にしておく感じでしょうか?
あとはデバッガで歩哨変数への書き込みをブレークポイントとして実行してPCから犯人探し。
・最適化off(-G0)にする・歩哨変数をvolatileにしておくあたりかなあ?最近のコンパイラはセキュリティ対策でスタックフレームまでいじる場合もあるからこれだけでいけるかは知らんけど。
この種のバグだと最適化オプションの有無で動作が変わることもあるんだよなあ(それこそスタックフレーム上に確保される変数が増えることで破壊されていたものがされなくなったとか)
ありがとうございます。K&R時代でやめてしまったのでvolatileは知らなかったのですか納得なものです。最適化禁止は挙動が変わりそうだと別の方が指摘されてますがコストが低いならダメもとで一回試してみるのもありかなあ。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
私は悩みをリストアップし始めたが、そのあまりの長さにいやけがさし、何も考えないことにした。-- Robert C. Pike
もし良かったら教えてもらえませんでしょうか (スコア:0)
最近さっぱりプログラミングしていない元プログラマで、歩哨変数という言葉に興味を持ちました。
スタック上に入っているリターンアドレスのすぐ上(あいまいな表現ですがわかってもらえることを期待)に歩哨変数を置くためにはどうしたらいいのでしょうか?
問題の関数の最初に置かれた初期化されたローカル変数だとスタック上の期待した位置に置いてくれるのかとも思ったけど下手に最適化されてレジスタになってたりすると困るから配列にしておく感じでしょうか?
あとはデバッガで歩哨変数への書き込みをブレークポイントとして実行してPCから犯人探し。
Re:もし良かったら教えてもらえませんでしょうか (スコア:0)
・最適化off(-G0)にする
・歩哨変数をvolatileにしておく
あたりかなあ?
最近のコンパイラはセキュリティ対策でスタックフレームまで
いじる場合もあるからこれだけでいけるかは知らんけど。
Re: (スコア:0)
この種のバグだと最適化オプションの有無で動作が変わることもあるんだよなあ
(それこそスタックフレーム上に確保される変数が増えることで破壊されていたものがされなくなったとか)
Re: (スコア:0)
ありがとうございます。
K&R時代でやめてしまったのでvolatileは知らなかったのですか納得なものです。
最適化禁止は挙動が変わりそうだと別の方が指摘されてますがコストが低いなら
ダメもとで一回試してみるのもありかなあ。