Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows longjmp超出向量异常处理程序_Windows_Exception Handling_64 Bit_Setjmp - Fatal编程技术网

Windows longjmp超出向量异常处理程序

Windows longjmp超出向量异常处理程序,windows,exception-handling,64-bit,setjmp,Windows,Exception Handling,64 Bit,Setjmp,64位Windows程序中的某些类型的事件,例如被零除、空指针引用、堆栈溢出(如果您使用保护页检测到),通常使用结构化或向量化异常处理(在发现有必要处理它们的程序中) 在JIT编译器的上下文中,结构化异常有点尴尬,因为需要提供展开信息并遵守所有函数的展开协议,这可能与移动代码块的复制垃圾收集器(建议使用向量化异常)交互不好 虽然向量异常处理程序通常会返回,但为此目的使用它们将涉及使用longjmp或一些等效代码退出处理程序,这些代码在不进行任何展开的情况下重置堆栈指针 这是合法的,还是我忽略了一

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

在JIT编译器的上下文中,结构化异常有点尴尬,因为需要提供展开信息并遵守所有函数的展开协议,这可能与移动代码块的复制垃圾收集器(建议使用向量化异常)交互不好

虽然向量异常处理程序通常会返回,但为此目的使用它们将涉及使用longjmp或一些等效代码退出处理程序,这些代码在不进行任何展开的情况下重置堆栈指针

这是合法的,还是我忽略了一些绊脚石

Unix中的等价物似乎是合法的,值得一提的是:

嗯,在我运行的测试中,它似乎工作得很好

#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();
}
#包括
#包括
#包括
jmp_buf jmp;
长回调eh(PEXCEPTION_指针e){
longjmp(jmp,1);
}
void main(){
AddVectoredExceptionHandler(1,eh);
对于(int i=0;i!=10;++i)
如果(!setjmp(jmp))
*(char*)0=0;
其他的
卖出(“ok”);
getchar();
}