Чем отличается отлов SIGSEGV на Win32 и на Unix? - PullRequest
0 голосов
/ 19 октября 2010

Я пишу код, который необходимо безошибочно скомпилировать и запустить на Unix / Mac (с GCC) и на Win32 (с mingw)Код должен работать в самых разных средах и иметь загружаемые модули, которыми я не могу управлять, поэтому я обычно защищаю каждый модуль с помощью setjmp () и signal ().

Я вижу, что в WIN32 есть и setjmp (), и signal ().Будет ли код работать переносимо, или мне нужно беспокоиться?

1 Ответ

2 голосов
/ 19 октября 2010

Продолжай и волнуйся. CRT должен эмулировать signal (), но MSVC одно явно упоминает, что longjmp () недопустим в обработчике, если он не обрабатывает SIGFPE. Проверь свои.

Эквивалентом SIGSEGV является исключение SEH с кодом исключения 0xc0000005 (STATUS_ACCESS_VIOLATION). Компилятор MSVC позволяет перехватывать их по ключевым словам __try и __except.

Идея "защиты" такого модуля глубоко ошибочна. Состояние вашей программы повреждено и не подлежит восстановлению, вы не представляете, как оно было изменено, поэтому у вас нет шансов восстановить его. Продолжение работы может привести к ряду неудач. Вам повезет, когда он умрет в другом исключении, и вы не поймете, в чем заключалась настоящая проблема, но, скорее всего, он просто сгенерирует неверные данные, которые не будут диагностироваться в течение длительного времени. Вам гораздо лучше просто не писать такой код. И решить вашу проблему с портированием в процессе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...