让 clang-tidy 发现静态可推导的逻辑错误

Getting clang-tidy to spot a statically deducible logic error

我不知道我想要的东西是否可行,但我想还是问问吧。

我有一些 Boost 库代码,我想提示 clang-tidy 发出警告,通过静态分析,由于逻辑错误可能会出现未定义行为的明显实例。 https://akrzemi1.wordpress.com/2016/12/12/concealing-bugs/ 建议 __builtin_unreachable() 像这样跳闸可能会很整洁,但我没能做到(尽管它很好地跳闸了 UB 消毒器):

#include <optional>

int main()
{
  std::optional<int> f;
  // Spot the UB before it happens and flag it
  if(!f)
  {
    __builtin_unreachable();
  }
  // Here is the UB
  return *f;
}

在上面的代码中,静态分析器可以清楚地告诉我们必须调用 __builtin_unreachable()。我想让 clang-tidy 报告这个,但 clang-tidy-5.0 -checks=* -header-filter=.* temp.cpp -- -std=c++17 什么也没报告。

注意我不需要使用 __builtin_unreachable(),这正是 Andrzej 的 C++ 博客所建议的。 任何 技术获取 clang 静态分析器,或 MSVC 静态分析器,或理想的 clang-tidy,以推断 UB 何时必须通过静态推导明显发生并在编译时标记它是我的正在寻找。

我不寻找的是一个构造,它总是在静态分析期间触发警告,而不管用例如何。我只希望在单独通过静态分析时出现静态分析警告,很明显在编译时可以调用 UB 给定一些静态可推导的逻辑错误。

提前致谢!

所以,是的,事实证明这至少不能在 clang-tidy 中完成,而且可能大多数其他静态分析器也是如此。

可以在 https://lists.llvm.org/pipermail/cfe-dev/2017-June/054120.html 找到关于为什么不的详细信息,但本质上:

  1. 停机问题,即不知道是否以及如何执行循环。
  2. clang-tidy 和其他分析器的构建是为了尽可能避免看到死代码。这与上面那种检查所需要的完全相反。