Вчера обнаружил очень приятную особенность компилятора С++ от VisualStudio 2008 для x86 - он автоматически удаляет блок try/catch если во всех вызовах функций между ними (в том числе и дочерних) не может возникнуть exception.
И надо заметить что это самая дурная особенность! Т.к. нормально предсказать появление эксепшиона компилятор не может. Его решение основывается только на С++ экспешионах при это полностью игнорируются SEH и эксепшионы математических операций (деление на ноль и т.п.) что приводит к полному развалу кода. Я однажды долго промучался... почему мой код математической операции не работает (на вход подавались невалидные данные и возникал SEH эксепшин математической операции), ведь защита try {} catch(...) установлена ? оказалось компилятор защиту выкинул "за ненадобностью"!Теперь вот во всех проектах приходится включать флаг /EHa
3 comments:
Такую особенность я видел еще у Visual Studio 6.0 (какой sp сходу не вспомню) при включенной оптимизации кода.
И надо заметить что это самая дурная особенность! Т.к. нормально предсказать появление эксепшиона компилятор не может. Его решение основывается только на С++ экспешионах при это полностью игнорируются SEH и эксепшионы математических операций (деление на ноль и т.п.) что приводит к полному развалу кода. Я однажды долго промучался... почему мой код математической операции не работает (на вход подавались невалидные данные и возникал SEH эксепшин математической операции), ведь защита try {} catch(...) установлена ? оказалось компилятор защиту выкинул "за ненадобностью"!Теперь вот во всех проектах приходится включать флаг /EHa
/EHa - дорогое удовольствие в смысле производительности. В моих проектах это непозволительная роскошь...
Post a Comment