c++ - 违反 noexcept 保证的编译器警告或静态分析?

标签 c++ c++11 noexcept

<分区>

我大量使用 noexcept,不幸的是,如果某些传递依赖最终导致极少数情况(我们不知道),崩溃将非常难以调试 - 因为 noexcept 会导致 std: :terminate 被调用。

有什么方法可以在编译时检测到这些违规行为吗?在下面的例子中 问题很明显,但默认情况下没有编译器捕获它。我意识到这在所有情况下都是不可能的,但肯定应该可以实现更简单的情况

#include <stdexcept>

void baz()
{
    throw std::runtime_error("std::terminate awaits");
}

void bar()
{
    baz();
}

void foo() noexcept
{
    bar();
}

神栓链接:https://godbolt.org/z/Ooet58

是否有我不知道的编译器标志?捕获此问题的静态分析工具怎么样?

最佳答案

看看微软的静态分析工具,它可以准确地检查这个违规行为:Don’t throw in noexcept

编辑:该工具还可以告诉您哪些函数可以标记为 noexcept,这应该可以更轻松地显着缩小抛出函数的范围。

关于c++ - 违反 noexcept 保证的编译器警告或静态分析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52895142/

相关文章:

c++ - 指向不同方法的 vector

c++ - Lua 访问表的键和值

c++ - Makefile: multiple definition and undefined reference 错误

c++ - std::thread::id 的 std::operator== 中的段错误

c++ - 对临时对象的 const 引用的列表初始化

c++ - 甚至调用函数之前的段错误

c++ - 如何在 C++ 中将运行时类型鉴别器映射到模板实例(无需手动枚举它们)?

c++ - noexcept 函数仍然可以调用在 C++17 中抛出的函数吗?

c++ - 在传递函数指针时是否应该转发有关 noexcept-ness 的知识?

testing - C++0x : noexcept(ndebug) for testing?