gpt4 book ai didi

c++ - catch(...) 吞下 xcode llvm 3.0 中的所有其他捕获

转载 作者:太空狗 更新时间:2023-10-29 23:19:17 26 4
gpt4 key购买 nike

我正在尝试让 googletest 在我的 C++ 项目上运行,其中一部分涉及使用 EXPECT_THROW(statement, expected_exception);。我正在使用选择了“Apple LLVM Compiler 3.0”的 XCode。所有这些都在 Snow Leopard 10.6.8、XCode 4.2 上进行。

即使使用显式虚拟案例 EXPECT_THROW(throw std::runtime_error(), std::runtime_error);

,我也无法通过任何这些测试

自己展开宏(from gtest/internal/gtest-internal.h:1114 GTEST_TEST_THROW_)后

    bool gtest_caught_expected = false;
try {
// GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement);
throw std::runtime_error("sigh");
}
// catch (expected_exception const&) {
catch (std::runtime_error const& e){
std::cout << "const ref caught" << std::endl;
gtest_caught_expected = true;
}
// added by me to check it wasn't a const& issue
catch (std::runtime_error e){
std::cout << "type caught" << std::endl;
gtest_caught_expected = true;
}
catch (...) {
//gtest_msg.value =
// "Expected: " #statement " throws an exception of type "
//#expected_exception ".\n Actual: it throws a different type.";
//goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__);
std::cout << "unknown caught" << std::endl;
}

然后使用 catch catch 在 gdb 中设置一个断点并单步执行,我可以看到 catch(runtime_errors) 被跳过,而 catch( ...) 正在执行。如果我注释掉 catch(...) block ,则会执行正确的 catch(std::runtime_error const& e) 语句。

将我的编译器设置为“LLVM GCC 4.2”解决了这个问题,但我想以 clang++ 为目标。

我单独的 EXPECT_THROW 测试用例在命令行上使用 clang++ 手动编译时有效,所以我认为它一定是一些深奥的 xcode 或 llvm 设置?或者也许 LLVM 是如何将我的 runtime_error 变成其他类型的?我尝试了 catch throw 但可以在该上下文中获取任何类型信息。

有没有人以前遇到过这种情况或有任何想法?

编辑:

所以我还链接了 libprofile_rt.dylib,以及编译器标志 -fprofile-arcs -fprofile-coverage。删除编译器标志 -fprofile-arcs 解决了这个问题。很烦人,因为它破坏了我的报道报告。

(与 librpofile_rt.a 的链接有同样的问题)

当然,我不是唯一看到这一点的人,因为 LLVM 据说使用 googletest 作为他们的测试用例?!

不确定我是否应该将此作为答案发布,或者是否会有更有知识的人出现并提供真正的解决方案。

最佳答案

稍等片刻后,似乎没有已知的修复方法,所以我将按照上面的方式发布我的答案。它可能在 Xcode 4.3 中得到修复

所以我还链接了 libprofile_rt.dylib,以及编译器标志 -fprofile-arcs -fprofile-coverage。删除编译器标志 -fprofile-arcs 解决了这个问题。很烦人,因为它破坏了我的报道报告。

(与 librpofile_rt.a 的链接有同样的问题)

当然,我不是唯一看到这一点的人,因为 LLVM 据说使用 googletest 作为他们的测试用例?!

关于c++ - catch(...) 吞下 xcode llvm 3.0 中的所有其他捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9919500/

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