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

Visual С++ Неуправляемый код: использовать /EHa или/EHsc для исключений С++?

Если я создаю новый проект в неуправляемом С++, Visual Studio 2008 или выше, с какой моделью обработки исключений я хочу пойти?

Я понимаю, что параметр /EHa приводит к менее эффективному коду, а также позволяет получить исключения SEH, правильно?

Итак, я избавился от этой опции и, как правило, перешел с /EHsc, так что я только перехватываю исключения на С++, которые на самом деле бросаются и не ловят нарушения доступа и другие структурированные исключения, в catch (...) обработчиках, Если в моем коде есть нарушение прав доступа, я не хочу, чтобы его маскировали catch (...) {}.

Я код с другими, которые хотят catch (...) {} ничего не делать, и они даже хотят, чтобы это делалось, если есть нарушение прав доступа, которое мне кажется очень плохой идеей. Если есть ошибка из-за плохого кодирования, вы не хотите вставлять свои пальцы в уши и громко говорить "La la la la la la!". так что вам не нужно крах программы? На самом деле, если код теперь находится в плохом состоянии из-за ошибки кодирования, вы действительно хотите, чтобы код продолжался?

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

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

Пожалуйста, взвешивайте свои мысли.

4b9b3361

Ответ 1

/EHa делает две вещи. Прежде всего, он подавляет оптимизацию, которая пропускает фильтры исключений, которые автоматически вызывают деструкторы локальных переменных класса, если анализатор кода не может видеть код, который может вызывать исключение С++. Это делает безопасным стекирование для любого исключения, а не только исключение С++. Накладные расходы для этих фильтров исключений - это время на x86 и место на x86 и x64.

И да, это изменяет поведение catch (...), теперь оно также фильтрует любое исключение SEH, а не только С++. Это действительно азартная игра, потому что вы поймаете все действительно неприятные вещи, асинхронные аппаратные исключения. Хотя я лично не думаю, что перехватывать все исключения на С++ тоже очень оправданно, у вас все еще есть смутная идея, в какой степени состояние программы получило мутацию и почему она не удалась.

Реально, вам нужно переключиться на использование __try/__except, чтобы вы могли написать свой собственный фильтр исключений и не ловить плохих. Код исключения для исключений С++ - 0xe04d5343 ( "MSC" ). Использовать _set_se_translator() будет другой подход.

Ответ 2

Я использую /EHa, потому что он безопасен с использованием .NET interop, тогда как /EHsc может и не быть; см. Деструкторы, которые не вызывают, когда родное (С++) исключение распространяется, например, на компонент CLR.

Однако, если для определенного бита кода важна дополнительная производительность, и вам не нужна совместимость .NET(или что-то еще), то уверен, /EHsc звучит нормально.

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