静态分析C++中noexcept"违规"

Kri*_*ege 15 c++ static-analysis exception noexcept

我正在尝试编写异常安全代码.我发现使用C++ 11的noexcept说明符可以使这个目标更容易实现.

当然,一般的想法是,如果并且只有当它调用的所有函数也标记为"noexcept"时,函数才应标记为"noexcept".

问题在于,在大型代码库中,来自不同人员的补丁经常合并在一起,很难确保维持这种一致性.

因此,我希望能够运行静态分析,该分析可以列出标记为"nothrow"的函数调用未标记为"nothrow"的函数的所有位置.

据我在man-page中看到,GCC无法帮助我.有没有可以帮助我的独立工具?或者其他一些编译器?

Mat*_* M. 6

如果你通过使用程序的ABT避免指向函数(并认为它们不安全),这似乎是可能的.Clang的AST(尽管它的名字)是这样一个ABT:你会看到函数的声明和定义.通过一次完成一项定义,您将拥有一个良好的基线.

另一方面,我想知道这是否实用.看,问题是执行内存分配的任何函数都(自愿)标记为可能抛出(因为new从不返回null,而是抛出bad_alloc).因此,noexcept在大多数情况下,您将被限制为少数功能.

当然,像@GManNickG这样的所有动态条件都暴露出来,例如:

void foo(boost::optional<T> const t&) {
    if (not t) { return; }

    t->bar();
}
Run Code Online (Sandbox Code Playgroud)

即使T::barnoexcept,取消引用optional<T>可能会抛出(如果没有).当然,这忽略了我们已经排除了这一事实(这里).

没有关于函数何时可能的明确条件throw,static分析可能证明......无用.语言习语在设计时考虑了例外情况.


注意:作为一个题外话,可以重写可选类,以免暴露解除引用,因此noexcept(如果回调是):

template <typename T>
class maybe {
public:

    template <typename OnNone, typename OnJust>
    void act(OnNone&& n, OnJust&& j) noexcept(noexcept(n()) and 
                                              noexcept(j(std::declval<T&>())))
    {
        if (not _assigned) { n(); return; }
        j(*reinterpret_cast<T*>(&_storage));
    }

private:
    std::aligned_storage<sizeof(T), alignof(T)>::type _storage;
    bool _assigned;
};

// No idea if this way of expressing the noexcept dependency is actually correct.
Run Code Online (Sandbox Code Playgroud)