【问题标题】:Can Clang warn me when I might throw an exception from a `noexcept` destructor?当我可能从 `noexcept` 析构函数中抛出异常时,Clang 可以警告我吗?
【发布时间】:2015-01-07 07:59:14
【问题描述】:

C++11 默认将析构函数指定为noexcept。有没有办法让 Clang 报告我的 noexcept 析构函数可能引发异常(并因此调用 std::terminate)的情况?

【问题讨论】:

  • 您是否要求解决停机问题? 是的,除非你想要很多错误检测。而且无论如何,规则要复杂一些。
  • @Deduplicator 是的,我正在寻求解决停止问题的方法。肯定在图灵和现在之间问题已经解决并且可以在 c++11 中检测到,如果不是 14 的话? /s
  • @Deduplicator 规则的复杂性是什么?我是这个特定问题的新手,但我想,例如,为 noexcept 析构函数设置了某种异常处理框架,可以用来向用户发出警告信号?

标签: c++11 exception-handling clang clang++ noexcept


【解决方案1】:

首先,C++ 默认不指定析构函数为noexcept
它将它们指定为noexcept(all subobjects destructors are noexcept)

接下来,我们可以将表达式和语句分别归为一个类别:

  1. 永不返回,可能返回,总是返回。
  2. 从不投掷,可能投掷,总是投掷。

在所有情况下,只有第一个案例会被标记为异常。

为了给出好的结果,编译器必须能够充分分析程序的行为,以确定对于任何可能的状态是否曾经执行过抛出表达式。

如果您对太多关于不可能场景的警告感到满意,您可以在此处获得结果。
反之,如果您只想警告公然案例,您也可能会得到一些结果。

麻烦的是,所有有趣的案例都转移到解决the halting problem
不,我们不再支持它。

【讨论】:

  • clang++ 可以同时检查:永不返回 (-Wmissing-noreturn) 和可能返回 (-Wreturn-type)。此外,它-Winvalid-noreturn 检查[[noreturn]] 函数中是否没有return。如果函数被标记为noexcept,他们可以检查所有代码路径是否为noexcept(警告,默认关闭)。与return 的区别在于,每个return 都是函数本身的显式语句。
  • 相比之下,这使得验证 noreturn 部分变得容易(如果所有都被标记,并且您假设所有未标记的函数 返回)。 noexcept 的问题在于,除非您想要太多误报,否则必须分析更多内容。
  • 感谢您对noexcept 规则的澄清,谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 2015-02-02
  • 2017-01-04
  • 1970-01-01
  • 2022-01-02
相关资源
最近更新 更多