Исключение в C ++, минуя Clang / llvm - PullRequest
1 голос
/ 29 мая 2019

У меня есть модульный тест, подобный следующему:

TEST_F( SocketServerTest, ParseTest ) {
  try {
//    throw InvalidAddressException( "bla" );
//    auto x = dv::socket::parseEndpoint( "127.0.0.1" );
    EXPECT_THROW( auto x = dv::socket::parseEndpoint( "127.0.0.1" ), InvalidAddressException );
  } catch ( const InvalidAddressException &e ) {
    FAIL() << boost::diagnostic_information( e, true );
  } catch ( const std::exception &e ) {
    FAIL() << boost::diagnostic_information( e, true );
  } catch ( ... ) {
    FAIL() << "bla";
  }
}

, который работает с GCC и MSVC, но с clang почему-то исключение отлавливается по умолчанию при проверке google test catch, и я получаю

unknown file: Failure
C++ exception with description "Invalid address 127.0.0.1 no port number" thrown in the test body.

Если я выбрасываю исключение непосредственно в тесте, оно работает, если я вызываю код без EXPECT_THROW, он попадает в обработчик исключений c ++ по умолчанию и прерывает работу программы.

Это делает то же самое для apple clang & clang8 на osx и clang 7 на fedora 29, но работает с gcc на fedora 29 и msvc 2019 на win 10

Исключение находится в разделяемой библиотеке и определяется с использованием макросов препроцессора и сгенерированного cmake заголовочного файла для выполненияатрибуты видимости.

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

Я пытался извлечь только этот кодв автономный проект cmake, но не может заставить его потерпеть неудачу таким же образом

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

1 Ответ

0 голосов
/ 29 мая 2019

После написания всего, что я понял, у меня есть атрибут ((чистый)) на parseEndpoint, удаляющий это, и все это работает.

...