0

64ビットWindowsプログラムの特定の種類のイベント(ゼロ除算、nullポインター参照、ガードページで検出された場合のスタックオーバーフローなど)は、通常、構造化またはベクトル化された例外で処理されます(それらを処理する必要があると判断したプログラムで)。 。

JITコンパイラのコンテキストでは、アンワインド情報を提供し、すべての関数のアンワインドプロトコルに準拠する必要があるため、構造化例外は少し厄介です。これは、コードブロックを移動するコピーガベージコレクタなどとうまく相互作用しない可能性があります。ベクトル化された例外の使用。

ベクトル化された例外ハンドラーは通常戻ることが期待されますが、この目的でそれらを使用するには、巻き戻しを行わずにスタックポインターをリセットするlongjmpまたは同等のコードでハンドラーを終了する必要があります。

これは合法ですか、それとも私が見落としている障害がありますか?

Unixでの同等のものは合法であるように思われますが、その価値は次のとおりです。Longjmpがシグナルハンドラから外れていますか?

4

1 に答える 1

0

さて、私が実行したテストではうまくいくようです。

#include <setjmp.h>
#include <stdio.h>
#include <windows.h>

jmp_buf jmp;

LONG CALLBACK eh(PEXCEPTION_POINTERS e) {
    longjmp(jmp, 1);
}

void main() {
    AddVectoredExceptionHandler(1, eh);
    for (int i = 0; i != 10; ++i)
        if (!setjmp(jmp))
            *(char*)0 = 0;
        else
            puts("ok");
    getchar();
}
于 2013-03-14T22:54:27.813 に答える