考慮這個代碼中,我故意導致訪問衝突:如果在任何時候發生異常,EFLAGS如何被信任,從而破壞EFLAGS?
#include <Windows.h>
int main(int argc, char** argv)
{
__try
{
*((unsigned char*)0) = 0;
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
__asm int 3;
}
return 0;
}
在的非法訪問的指令,EFLAGS
是0x282
(之前執行它)。當我單打步驟時,它變爲0x10382
。然後我再一步將異常傳遞給應用程序。異常處理程序處理異常並返回到正常的執行流程。但是,這次EFLAGS
已更改爲0x244
。其他一些寄存器也被改變了。
如果潛在的任何指令,可能會出現異常時,編譯器如何可在EFLAGS
用途及其他寄存器所以一定時,一個異常被處理之後,EFLAGS
和可能的其它寄存器可包含比現有的不同值到什麼時候發生異常?這將會破壞其後的每個分支決策。