У меня есть модульный тест, подобный следующему:
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, но не может заставить его потерпеть неудачу таким же образом
Как я могу отладить, почему это происходит,Я был в этом в течение нескольких дней без прогресса.