Kri*_*ege 15 c++ static-analysis exception noexcept
我正在尝试编写异常安全代码.我发现使用C++ 11的noexcept说明符可以使这个目标更容易实现.
当然,一般的想法是,如果并且只有当它调用的所有函数也标记为"noexcept"时,函数才应标记为"noexcept".
问题在于,在大型代码库中,来自不同人员的补丁经常合并在一起,很难确保维持这种一致性.
因此,我希望能够运行静态分析,该分析可以列出标记为"nothrow"的函数调用未标记为"nothrow"的函数的所有位置.
据我在man-page中看到,GCC无法帮助我.有没有可以帮助我的独立工具?或者其他一些编译器?
如果你通过使用程序的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::bar是noexcept,取消引用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)