64位Windows程序中的某些事件,例如除以零,空指针引用,如果使用保护页检测到堆栈溢出,则通常使用结构化或向量异常处理(在发现必须处理它们的程序中)。
在JIT编译器的上下文中,由于需要提供展开信息并且符合所有函数的展开协议,结构化异常稍微不方便,这些函数可能与例如移动代码块的复制垃圾收集器,建议使用向量异常。
虽然通常期望向量异常处理程序返回,但为此目的使用它们将涉及使用longjmp或某些等效代码退出处理程序,该代码重置堆栈指针而不进行任何展开。
这是合法的,还是有一些我忽视的绊脚石?
Unix中的等价物似乎是合法的,因为它值得:Longjmp out of signal handler?
答案 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();
}