如何让Clang Static Analyzer从命令行输出?

时间:2014-03-13 07:24:21

标签: c++ linux command-line clang clang-static-analyzer

我在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网站的截图,其中显示了在网络浏览器中查看的工作步骤:

screenshot

这可能是从Xcode获得的。

问题是:如何让Clang从命令行输出这些工作步骤?如果愿意,甚至可以将结果输出到浏览器?这会使分析仪显着更有用,并且可以更快地修复。

(我注意到GCC的文档非常优秀,但是Clang / LLVM的文档很差。我已经尝试过“clang --analyze -Xanalyzer'-v'”作为黑暗中的刺,告诉分析仪更详细 - -Xanalyzer开关来自手册页。)

3 个答案:

答案 0 :(得分:20)

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

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<选项名称> =<值>

E.g。

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

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

答案 1 :(得分:6)

你走在正确的轨道上,但要获得导致错误的完整痕迹,你还需要以文本格式询问clang输出(不要问为什么)。因为您可能需要调整,例如无论如何,包括你的项目的路径或定义,我建议你使用clang-check作为clang的分析器传递的包装器。它还可以挂入例如暴露于其中的静态分析仪工具中。 scan-build。那么你可以

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

就像你写的这些非常好的工具的文档是非常糟糕的。我从Chandler Carruth's GoingNative2013 talk的点点滴滴拼凑了上面的电话。

答案 2 :(得分:3)

您必须使用scanbuild:http://clang-analyzer.llvm.org/scan-build.html

您键入生成构建的命令,但是您使用scan-build预先挂起它们。

实施例: 而不是

make

scan-build make

而不是

./configure
make

scan-build ./configure
scan-build make

在启动分析仪之前清除构建,否则make会说明所有内容已经构建完毕,分析仪将无法运行。