私は自分のコード (setjmp を使用) で断続的にクラッシュするバグを追跡しようとしており、次のように絞り込みました: /O2 でコンパイルすると表示され、/O2 /Oy- で表示されなくなります。フレームポインタ。
http://msdn.microsoft.com/en-us/library/2kxx5t2c(v=vs.80).aspxは、setjmp にはフレーム ポインターが必要であることを示唆しています。したがって:
setjmp を使用するプログラムが /O2 でコンパイルされると、Visual C++ は、断続的なスタック破損を引き起こすコードをサイレント モードで生成するようです。これは本当ですか、それとも何か不足していますか?
setjmp を呼び出す関数のみをフレーム ポインターでコンパイルする必要があるように思われます。プログラムの残りの部分 (longjmp を呼び出す関数であっても) は、フレーム ポインターを省略してもかまいません。これは本当ですか?
編集:もう少し絞り込みました。
setjmp を呼び出していた関数でフレーム ポインターを有効にしても違いはありませんでしたが、これは、コンパイラーが既にそれを実行していたためであり、実行する必要があることに明らかに気づき、自動的に実行していました。
違いがあったのは、メインでフレーム ポインターを有効にしたことです。クラッシュはメインから返ってきたので、それは思ったほど奇妙ではありません。考えてみると、setjmp の使用法を Google で簡単に検索すると、すべての例が main で実行されます。おそらく、マイクロソフトのコンパイラ チームがその方法でしかテストしなかったのでしょう。
これは慣用的な使用方法ですが、おそらく最善の回避策は、setjmp を使用する関数を main にインライン化することです。