C の構造化例外処理について読んでいます。期待どおりに動作しないサンプル コードを次に示します。
このコードは次の場所から取得されます。
http://msdn.microsoft.com/en-us/library/ha52ak6a.aspx
// C4733.cpp
// compile with: /W1 /c
// processor: x86
#include "stdlib.h"
#include "stdio.h"
void my_handler()
{
printf("Hello from my_handler\n");
exit(1);
}
int main()
{
_asm {
push my_handler
mov eax, DWORD PTR fs:0
push eax
mov DWORD PTR fs:0, esp // C4733
}
*(int*)0 = 0;
}
このコードは、無効なメモリ アドレスに書き込もうとして例外がトリガーされたときに、「Hello from my_handler」というメッセージを出力する必要があります。ただし、例外ハンドラはまったく呼び出されていないようです。
このコードをコンパイルし、Olly Debugger でデバッグしてみました。例外が発生すると、アプリケーションで定義された例外ハンドラーに例外を渡そうとしますが (Shift + F9 キーを押して)、呼び出されません。例外ハンドラ (最初の命令) にブレークポイントを設定しましたが、コードのそのセクションに到達しません。
この理由は何でしょうか?