c++ 如何使叮当静态分析器输出其工作从命令行?

ryoqjall  于 2023-02-20  发布在  其他
关注(0)|答案(3)|浏览(85)

我在Ubuntu 12.10上运行Clang 3.4(来自http://llvm.org/apt/),我对一些代码运行了分析器(clang --analyze),它发现了一些问题:

Blah.C:429:9: warning: Declared variable-length array (VLA) has zero size
        unsigned char separatedData[groupDataLength];
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~

但具体的问题并不重要,我想知道它是如何得出这个结论的(代码足够复杂,我在15分钟内看不到它)。
我看到一个来自Clang网站的屏幕截图,其中显示了在Web浏览器中查看的工作步骤:

这可能是从Xcode获得的。

问题是:我如何让Clang从命令行输出这样的工作步骤?2或者甚至输出结果到浏览器,如果它愿意的话?3这将使分析器明显更有用,并使修复工作更快。

(我注意到GCC的文档非常优秀,但是Clang/LLVM的文档非常差。我尝试了“clang --analyze -Xanalyzer '-v'”作为一种尝试,告诉分析器要更详细一些---Xanalyzer开关来自手册页。)

qmelpv7a

qmelpv7a1#

除了控制台上的文本输出外:

clang++ --analyze -Xanalyzer -analyzer-output=text main.cpp

你可以得到完整的html输出:

clang++ --analyze -Xanalyzer -analyzer-output=html -o html-dir main.cpp

此外,还可以选择要启用的特定检查器。This page列出了可用检查。例如,可以使用以下标志启用alpha组中的所有C++检查:

-Xanalyzer -analyzer-checker=alpha.cplusplus

http://coliru.stacked-crooked.com/a/7746c4004704d4a7

main.cpp:5:1: warning: Potential leak of memory pointed to by 'x'
}
^
main.cpp:4:12: note: Memory is allocated
  int *x = new int;
           ^~~~~~~
main.cpp:5:1: note: Potential leak of memory pointed to by 'x'
}
^

很明显前端暴露了
-analyzer-config〈选项名称〉=
例如

-analyzer-config -analyzer-checker=alpha.cplusplus

其可能比-Xanalyzer得到更好的支持,并且可能被扩展以支持针对各个检查器的选项:http://lists.cs.uiuc.edu/pipermail/cfe-dev/2014-October/039552.html

7uzetpgm

7uzetpgm2#

你的思路是对的,但是要获得导致bug的完整跟踪,您还需要请求clang以文本格式输出(不要问为什么)。因为你可能需要调整,比如说include路径或者定义你的项目,我建议你使用clang-check,它可以作为clang的analyzer pass的 Package 器。scan-build。然后您可以

$ clang-check -analyze -extra-arg -Xclang -extra-arg -analyzer-output=text

就像你为这些非常好的工具写的文档一样糟糕透顶。我从Chandler Carruth's GoingNative2013 talk的点点滴滴拼凑了上面的调用。

rmbxnbpk

rmbxnbpk3#

您必须使用scanbuild:http://clang-analyzer.llvm.org/scan-build.html
您可以键入生成构建的命令,但要在它们前面加上scan-build。
示例:代替

make

类型

scan-build make

代替

./configure
make

类型

scan-build ./configure
scan-build make

在启动分析器之前清除构建,否则make将声明所有内容都已构建,分析器将不会运行。

相关问题