2013-03-14 62 views
0

64位Windows程序中的某些種類的事件,例如如果你通過一個保護頁檢測到它,那麼除零,空指針引用,堆棧溢出通常被處理(在一個程序中發現它是處理它們所必需的),並帶有結構化或向量化的異常。longjmp out of vectored exception handler

在JIT編譯器的上下文中,由於需要提供展開信息並符合所有函數的展開協議,因此結構化例外稍微有些尷尬,因爲這些協議可能與例如一個複製垃圾回收器,用於移動代碼塊,這表明使用了向量異常。

雖然向量化異常處理程序通常需要返回,但爲此目的使用它們將涉及使用longjmp或一些等效代碼退出處理程序,該代碼會在不進行任何展開的情況下重置堆棧指針。

這是合法的,還是有一些我忽略的絆腳石?

UNIX中的等價似乎是合法的,什麼是值得:Longjmp out of signal handler?

回答

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(); 
}