【发布时间】:2021-11-04 03:45:48
【问题描述】:
我正在尝试编写异常安全代码。我发现使用 C++11 的 noexcept 说明符使这个目标更容易实现。
当然,一般的想法是,当且仅当它调用的所有函数也都标记为“noexcept”时,一个函数才应该标记为“noexcept”。
问题在于,在大型代码库中,来自不同人的补丁经常合并在一起,很难确保保持这种一致性。
所以我希望能够运行静态分析,该分析可以列出标记为“nothrow”的函数调用未标记为“nothrow”的函数的所有位置。
据我在手册页中看到的,GCC 无法帮助我。有没有可以帮助我的独立工具?或者其他一些编译器?
【问题讨论】:
-
这总是一个好主意,但在实践中它可能会失败,因为你的无抛出函数的复杂性增加了。我在别处看到的一个例子:
double safe_sqrt(double x) { if (x < 0) throw "no"; return sqrt(x); } double abs_sqrt(double x) noexcept { return safe_sqrt(abs(x)); }noexcept 函数调用了一个抛出函数,但这是安全的,因为无法到达抛出路径。但是,静态分析不再像“我是否调用 noexcept 函数”那么简单。当然,仍然可行,但要困难得多。还有一些解决方法,但我怀疑它们在每种情况下都很简单(这个是)。 -
是的,这是个问题,但是,在这种情况下,您要么接受分析仪的“误报”,要么干脆不将 abs_sqrt 标记为“noexcept”。我仍然觉得这样的工具会提供很大的价值。
-
顺便说一句,你可能想读这个:akrzemi1.wordpress.com/2011/06/10/using-noexcept(有人把它贴到我的 noexcept Q 上)
-
看看clang...它可能还没有实现,但是扩展分析器很简单
-
@NoSenseEtAl:根据 andrzej 的博客“不投掷保证的静态检查,以及用于本地禁用检查的改进工具。”很可能成为下一个 C++ 版本的一部分。不错!
标签: c++ exception static-analysis noexcept