在下面顯示的代碼中,我使用了所有記錄的方式來檢測異常並生成診斷。它使用C++ try/catch關鍵字,通過__try/__catch
擴展關鍵字捕獲SEH異常,使用Windows的AddVectoredExceptionHandler()和SetUnhandledExceptionFilter()winapi函數來安裝VEH/SEH過濾器。如何報告Windows上的堆棧緩衝區溢出?
在Visual C++ 2003中運行:
/GS:輸出「hello,world!」並以退出代碼0結束。
/GS-:輸出「hello,world!」和退出代碼爲0
終止使用Visual C運行該++ 2013:
/GS:無輸出,終止,退出代碼爲-1073740791
/GS-: 「你好,世界」 輸出並與0
退出終止怎樣產生的診斷與有效/ GS一個VS2013編譯的程序?
#include "stdafx.h"
#include <Windows.h>
#define CALL_FIRST 1
#define CALL_LAST 0
LONG WINAPI MyVectoredHandler(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
UNREFERENCED_PARAMETER(ExceptionInfo);
printf("MyVectoredHandler\n");
return EXCEPTION_CONTINUE_SEARCH;
}
LONG WINAPI MyUnhandledExceptionFilter(_In_ struct _EXCEPTION_POINTERS *ExceptionInfo)
{
printf("SetUnhandledExceptionFilter\n");
return EXCEPTION_CONTINUE_SEARCH;
}
void f()
{
__try
{
char p[20] = "hello,world!";
p[24] = '!';
printf("%s\n", p);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("f() exception\n");
}
}
int _tmain(int argc, _TCHAR* argv[])
{
AddVectoredExceptionHandler(CALL_FIRST, MyVectoredHandler);
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
try{
f();
}
catch (...){
printf("catched f exception\n");
}
return 0;
}
您的代碼導致未定義的行爲。 「檢測」的唯一可靠方法是在執行界限外訪問 –
之前檢查邊界,例如,如果您使用檢測的容器類型,將執行什麼操作。例如對字符串使用'std :: string',並用'at'成員函數對其進行索引。 – Hurkyl
堆棧超限很難檢測到。它們只在覆蓋堆棧幀時觸發。嘗試切換運行時異常*數組界限超出*。它可能工作。 – cup