В коде, показанном ниже, я использовал все задокументированные способы обнаружения исключения и создания диагностики. Он использует ключевые слова C++ try/catch, перехватывает исключения SEH с ключевыми словами расширения __try/__catch
, использует WinAPI-функции AddVectoredExceptionHandler() и SetUnhandledExceptionFilter() для установки фильтров VEH/SEH.
Выполнение этого с Visual C++ 2003:
/GS: выводит "hello,world!" и завершается с кодом выхода 0.
/GS-: выводит "hello,world!" и завершается с кодом выхода 0.
Выполнение этого с Visual C++ 2013:
/GS: ничего не выводится, завершается кодом выхода -1073740791
/GS-: выводит "hello,world!" и завершается выходом с 0.
Как создать диагностику в скомпилированной программе VS2013 с действующим параметром /GS?
#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;
}