Мое приложение x64 скомпилировано с /EHa,
Я хочу защитить свой код от нарушений доступа, но процесс приложения, похоже, сбой, независимо от моих обработчиков SEH и завершения.
void my_se_translator(unsigned int, struct _EXCEPTION_POINTERS*) {
cout << "se_translator_called" << endl;
}
void my_terminate_handler() {
cout << "my_terminate_handler_called" << endl;
}
#pragma optimize("", off)
void test() {
int* k = nullptr;
int z = *k;
}
#pragma optimize("", on)
int main(int argc, char* argv[]) {
_set_se_translator(my_se_translator);
set_terminate(my_terminate_handler);
test();
return 0;
}
Поблагодарили бы за хорошее объяснение, почему _set_se_translator не работает в этом случае?
На веб-сайте MSDN:
Функция вашего переводчика должна делать не более, чем выброс исключенного типа C++. Если он делает что-либо в дополнение к метанию (например, запись в файл журнала, например), ваша программа может работать не так, как ожидалось, потому что количество раз, когда вызывается функция транслятора, зависит от платформы.
когда вы добавляете простой класс исключений:
class myException{
};
Затем отбросьте исключение в функции my_se_translator и поймайте исключение в основной или тестовой функции, которую должен работать ваш пример.
void my_se_translator(unsigned int, struct _EXCEPTION_POINTERS*) {
std::cout << "se_translator_called" << std::endl;
throw myException();
}
int main(int argc, char* argv[]) {
_set_se_translator(my_se_translator);
set_terminate(my_terminate_handler);
try{
test();
}
catch(myException e) {
std::cout << "EXCEPTION!" << std::endl;
}
return 0;
}