longjmp不受矢量异常处理程序的影响

时间:2013-03-14 11:50:41

标签: windows exception-handling 64-bit longjmp

64位Windows程序中的某些事件,例如除以零,空指针引用,如果使用保护页检测到堆栈溢出,则通常使用结构化或向量异常处理(在发现必须处理它们的程序中)。

在JIT编译器的上下文中,由于需要提供展开信息并且符合所有函数的展开协议,结构化异常稍微不方便,这些函数可能与例如移动代码块的复制垃圾收集器,建议使用向量异常。

虽然通常期望向量异常处理程序返回,但为此目的使用它们将涉及使用longjmp或某些等效代码退出处理程序,该代码重置堆栈指针而不进行任何展开。

这是合法的,还是有一些我忽视的绊脚石?

Unix中的等价物似乎是合法的,因为它值得:Longjmp out of signal handler?

1 个答案:

答案 0 :(得分: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();
}