Подтвердить что ты не робот

EHsc vc EHa (синхронная и асинхронная обработка исключений)

Не могли бы вы дать список пулей практических различий/последствий? Я прочитал соответствующую статью MSDN, но мое понимание асинхронных исключений все еще немного туманно.

Я пишу тестовый пакет, используя Boost.Test, и мой компилятор выдает предупреждение о том, что EHa должен быть включен:

предупреждение C4535: вызов _set_se_translator() требует /EHa

Сам проект использует только простые исключения (из STL) и не нуждается в/EHa-переключателе. Нужно ли перекомпилировать его с помощью переключателя /EHa, чтобы тестовый набор работал правильно? Я чувствую, что мне нужен /EHa только для тестового костюма.

4b9b3361

Ответ 1

Когда вы используете /EHsc, компилятор будет генерировать код только для фильтров исключений, когда он сможет обнаружить, что код, заключенный в блок try {}, может вызывать исключение С++. Фильтр исключений гарантирует, что деструктор любых локальных объектов С++ вызывается, когда стек разматывается при обработке исключения. Это заставляет RAII работать.

Это оптимизация, пространство и время для кода x86, пространство для кода x64. Space, потому что он может опустить код фильтра исключений, который является скромным. Время, потому что на x86 он может избежать регистрации фильтра исключения при вводе блока try {}. Очень скромный кстати. x64 использует другой способ поиска фильтров исключений, он основан на таблицах.

Ключевая фраза в первом параграфе "может вызывать исключение С++". В Windows есть другие источники исключений. Подобно "a" in/EHa, асинхронные исключения, которые возникают в аппаратном обеспечении. Такие вещи, как исключения с плавающей запятой, деление на ноль и исключительное исключение нарушения прав доступа. Но также, в частности, те исключения, которые возникают из-за кода, с которым вы могли бы взаимодействовать. Как управляемый код, в основном все, что работает в VM.

Если вы хотите сделать ваши объекты безопасными для подобных исключений, тогда вам нужно будет использовать /EHa, который сообщает компилятору всегда регистрировать фильтр исключений.

Остерегайтесь неприятного побочного эффекта /EHa, он заставляет (...) проглатывать все исключения. Включая те, которые вы никогда не должны ловить, например, AV и SO. Посмотрите __try/__except и _set_se_translator(), если это важно для вас.

Ответ 2

Ну, без /EHa вы не можете поймать неожиданные исключения, чтобы ваша тестовая программа выходила аномально.

Если тест может быть сделан для аномального выхода, лучше не бороться с /EHa.

Кроме того, изменение опции /EHa вызывает множество побочных эффектов, включая увеличение размера исполняемого файла и небольшое снижение производительности. Так эффективно изменяет оригинальное поведение.

Использовать или не использовать /EHa - это большое решение, обычно принимаемое на этапе разработки программы.

IMHO, проблемы при написании тестового сценария довольно незначительны, чтобы изменить это решение.