Отключение исключений для MSVC - PullRequest
0 голосов
/ 13 ноября 2010

Я пытаюсь полностью отключить исключения в Visual Studio 2010, и чтобы убедиться, что обработка исключений отключена, у меня есть следующий тест:

class CompilerFlagsTestExceptionConstructor
{
public:
 CompilerFlagsTestExceptionConstructor() { throw std::exception("Exceptions Enabled"); }
 ~CompilerFlagsTestExceptionConstructor() { }
};

class CompilerFlagsTests : public CPPUNIT_NS::TestFixture
{
 CPPUNIT_TEST_SUITE( CompilerFlagsTests );
  CPPUNIT_TEST( Test_NoExceptions );
 CPPUNIT_TEST_SUITE_END();
public:
 void Test_NoExceptions()
 {
  try
  {
   CompilerFlagsTestExceptionConstructor object;
  }
  catch(std::exception)
  {
   assert(!"Exceptions are enabled");
  }
 }
};

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

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

Причина, по которой я хочуОтключение обработки исключений связано с тем, что целевое программное обеспечение написано для целевой архитектуры, которая изначально не поддерживает обработку исключений и вызывает массовое разрастание кода для размещения разматывания стека.Целевая архитектура также имеет максимальный размер исполняемого файла, поэтому отключение исключений сокращает код, а также повышает производительность.Я хочу отключить обработку исключений в версии Windows, чтобы убедиться, что обработка ошибок для цели работает.

Я что-то не так делаю?Этот тест когда-нибудь сработает?Есть ли другой способ заставить и протестировать отключение исключений?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 14 ноября 2010

Это не то, что делает / EH, оно просто контролирует то, какие обработчики раскрутки испускаются./ EHsc гарантирует, что деструкторы вызываются при возникновении исключений в C ++, / EHa гарантирует, что они вызываются для любых исключений, включая SEH.Пропуск / EH - это то, что вы хотите сократить из-за издержек обработчика, компилятор пропускает фильтры исключений, которые вызывают деструкторы, вызываемые для объектов, выделенных стеком.Измените деструктор следующим образом:

~CompilerFlagsTestExceptionConstructor() { 
    assert(!"Something is wrong with /EH");
}

Если вы хотите искать нежелательный код try / catch, вам нужно обратить внимание на предупреждение

C4530: Обработчик исключений C ++используется, но семантика раскрутки не включена.Укажите / EHsc

1 голос
/ 31 декабря 2016

/EHsc- должен сделать трюк (по крайней мере, это делает с MSVC 14)

0 голосов
/ 14 ноября 2010

Я не уверен, что ваш тест имеет смысл. Каким должно быть поведение, если исключения отключены? бросить просто становится не оп? Это то, что тест предполагает поведение.

Я ожидаю, что для полезного отключения исключения throw должно быть ошибкой компиляции, или, наоборот, генерирование с отключенными исключениями должно немедленно завершить процесс.

Но это отступление. MSVC отправит вызов _CxxThrowException для синтаксиса броска. Если мы определим нашу собственную версию этого, мы можем заставить ее танцевать под нашу песню:

#include <windows.h>
#include <stdio.h>

extern "C"
void __stdcall _CxxThrowException(void * pObject,
    _s__ThrowInfo const * pObjectInfo)
{

  printf("Nope\n");
}

struct a
{ };

int main()
{
  try {
  throw a();
  } catch(const a&) {
    printf("Caught an exception\n");
  }
}

Эта программа печатает

Неа

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

...