gpt4 book ai didi

C++ Exception 绕过 clang/llvm 上的 catch

转载 作者:太空宇宙 更新时间:2023-11-04 12:35:58 33 4
gpt4 key购买 nike

我有这样的单元测试:

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++ 异常处理程序并中止程序。

它在 osx 上的 apple clang & clang 8 和 fedora 29 上的 clang 7 上做同样的事情,但在 fedora 29 上与 gcc 和 win 10 上的 msvc 2019 一起工作

异常位于共享库中,使用预处理器宏和 cmake 生成的头文件来定义可见性属性。

以相同方式定义的其他异常在其他地方工作,当从同一库中的不同代码抛出时,相同的异常也有效。

我试过将这段代码拉出到一个独立的 cmake 项目中,但无法以同样的方式让它失败

我如何调试发生这种情况的原因,我已经研究了好几天没有任何进展。

最佳答案

在写完所有内容后,我意识到我在 parseEndpoint 上有属性((pure)) 删除它,一切正常。

关于C++ Exception 绕过 clang/llvm 上的 catch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56354217/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com