【问题标题】:How to make the Clang Static Analyzer output its working from command line?如何使 Clang 静态分析器从命令行输出其工作?
【发布时间】:2014-04-17 18:48:52
【问题描述】:

我在 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 从命令行输出这些工作步骤?或者,如果它愿意,甚至可以将结果输出到浏览器?这将使分析器变得更加有用,并且使修复问题变得更快。

(我注意到 GCC 的文档非常出色,但 Clang/LLVM 的文档很差。我尝试使用“clang --analyze -Xanalyzer '-v'”作为暗中的刺,告诉分析器更详细一点——-Xanalyzer 开关来自手册页。)

【问题讨论】:

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


【解决方案1】:

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

您键入生成构建的命令,但您在它们前面加上 scan-build。

示例: 而不是

make

类型

scan-build make

而不是

./configure
make

类型

scan-build ./configure
scan-build make

在启动分析器之前清除构建,否则make会声明一切都已经构建并且分析器不会运行。

【讨论】:

  • 我做了:> scan-build "[usual compiler command]" 它只是正常编译(没有效果)。所以我做了:> scan-build "[usual compiler command including --analyze]" 导致:scan-build: Using '/usr/bin/clang' for static analysis ...
  • Blah.C:429:9: warning: Declared variable-length array (VLA) has zero size(和以前一样)2 warnings generated.scan-build: Removing directory '/tmp/scan-build-2014-03-14-083438-2804-1' because it contains no reports.scan-build: No bugs found.
  • 所以我之前确实看过 scan-build,但我不知道它是否适用于我的自定义构建系统(不是 make)。我真的不想要一个包装器,因为我认为它在一个命令行调用中已经有足够的信息,如果它可以找到它有的问题(我只想要这些步骤)。原来我不知道如何使用它,或者它对我的构建系统没有任何用处......
  • @Paolo Brandoli 我同意 Jetski S 型 - 我试过 scan-build cmake .; scan-build make,它只是说“没有发现错误”。
【解决方案2】:

您在正确的轨道上,但要获得导致错误的完整跟踪,您还需要向 clang 询问文本格式的输出(不要问为什么)。因为您可能需要调整例如无论如何,为您的项目包含路径或定义我建议您使用clang-check,它充当clang 分析器通道的包装器。它还可以连接到公开的静态分析器工具,例如scan-build。然后就可以了

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

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

【讨论】:

  • 宾果游戏!快到了,但实际有效的命令行是:clang++ --analyze [usual stuff] -Xanalyzer -analyzer-output=text
  • 事实上,该命令不起作用:clang-check -analyze -extra-arg -Xclang -extra-arg -analyzer-output=text [file-path]LLVM ERROR: Could not auto-detect compilation database for file [path]No compilation database found in [path] or any parent directoryjson-compilation-database: Error while opening JSON database: No such file or directory
  • 最后确实需要一些特殊的破折号来阻止该错误:clang-check -analyze -extra-arg -Xclang -extra-arg -analyzer-output=text [file-path] --,这导致:fatal error: include file not found(它没有路径)。并且将 -Ipath 添加为 -extra-args 也不起作用。总之,我不知道如何使用 clang-check 或者在这种情况下是否有任何额外用途....
  • 我确实记得在那个视频中看到了很棒的分析器的东西,但我不记得它是从哪里回到它的......这确实是一个很大的耻辱文档是如此糟糕如此出色的工具......他们想知道为什么 Clang 没有充分发挥其潜力......
  • 对于 clang-check 你需要一个编译数据库。如果你不使用 cmake,你可以使用github.com/rizsotto/bear 创建一个。
【解决方案3】:

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

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

【讨论】:

  • 干杯!这很有用,虽然我通常会使用文本输出。
  • -analyzer-config 在 6.0 版中似乎不起作用,但 -Xanalyzer 可以。
  • 最好使用-Xanalyzer -analyzer-output=html 而不是--analyzer-output html
猜你喜欢
  • 1970-01-01
  • 2013-11-20
  • 2021-01-07
  • 1970-01-01
  • 2015-12-03
  • 2010-12-24
  • 2016-11-17
  • 1970-01-01
  • 2014-06-20
相关资源
最近更新 更多