2017-10-18 59 views
1

我不知道我想要什么是可能的,但我反正给它一个问题。得到叮当声,发现一个静态可诱发的逻辑错误

我有一些Boost库代码,我想暗示要通过静态分析发出警告,通过静态分析可以发现由于错误逻辑而导致的未定义行为的明确实例。 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-5.0 -checks=* -header-filter=.* temp.cpp -- -std=c++17什么也没有报告。

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

我不在寻找的是一种构造,其中总是在静态分析过程中出现警告,与用例无关。我只希望单独通过静态分析时出现静态分析警告,在编译时显而易见的是,如果给定一些静态可导致的逻辑错误,可以调用UB。

我提前致谢!

回答

0

所以,是的,事实证明,这至少不可能在铿锵声中完成,也可能是大多数其他静态分析器。

的,为什么不能够在https://lists.llvm.org/pipermail/cfe-dev/2017-June/054120.html中发现的血淋淋的细节,但在本质:

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