scan-build: 从命令行运行分析器

它是什么?

scan-build 是一个命令行实用程序,使用户能够运行静态分析器分析其代码,作为执行常规构建(从命令行)的一部分。

它是如何工作的?

在项目构建期间,当源文件被编译时,它们也被静态分析器一并分析。

在构建完成后,然后在浏览器内向用户呈现结果。

它可以与其他构建系统一起工作吗?

scan-build 对您如何构建代码几乎没有任何了解。它的工作原理通过覆盖 CC 和 CXX 环境变量(希望)使用一个“假的”编译器 ccc-analyzer 或 c++-analyzer 改变您的构建环境。这个伪编译器执行 clang 或 gcc(取决于平台)来编译代码,然后执行静态分析器来分析代码。

这种“穷人的介入”在许多情况下工作非常好,在其他情况下则不行。请参阅本页上的信息,更好地使用 scan-build,包括在上述 hack 无法正常工作时,依旧使其工作。

scan-build
analyzer in browser
在浏览器中查看静态分析器结果

内容

入门

scan-build 命令可以用于通过插入项目的构建过程来分析整个项目。这意味着要使用 scan-build 运行分析器,您将使用 scan-build 分析在项目构建期间由 gcc/clang 编译的源文件。这意味着未编译的文件不会被分析。

基本用法

scan-build 的基本用法很简单:只需在 build 命令前面放置“scan-build”:

$ scan-build make
$ scan-build xcodebuild

第一种情况,scan-build 分析使用 make 构建的项目的代码,第二种情况,scan-build 分析使用 xcodebuild 构建的项目。

下面是调用 scan-build 的一般格式:

$ scan-build [scan-build 选项] <command> [命令选项]

scan-build 运行<command>,并传递所有后续选项。例如,可以 make -j4 在4核上获得并行构建:

$ scan-build make -j4

所有情况下,scan-build 不会解释编译命令后的选项; 只是传递他们。一般来说,scan-build 支持并行构建,但不支持分布式构建

也可以使用 scan-build 来分析特定文件:

 $ scan-build gcc -c t1.c t2.c

此示例分析文件 t1.ct2.c

针对 Windows 用户

Windows 用户必须安装 Perl 才能使用 scan-build。

scan-build.bat 脚本允许您按照上述基本用法中所述的相同方式使用 scan-build。想从任意位置调用 scan-build,请将包含 scan-build.bat 的文件夹的路径追加到您的 PATH 环境变量。

如果您在使用 MinGW/MSYS 运行 scan-build 时出现意外的编译/make 问题,以下信息可能会有所帮助:

其他选项

如上所述,额外的选项可以传递给 scan-build。这些选项在 build 命令之前。例如:

 $ scan-build -k -V make
 $ scan-build -k -V xcodebuild

这里是一个有用的选项子集:

选项描述
-oHTML 报告文件的目标目录。将根据需要创建子目录以表示独立“运行”的分析器。如果未指定此选项,将在/tmp 中创建一个(scan-build-XXX)目录存储报告。
-h
(或没有参数)
显示 scan-build 所有选项。
-k
--keep-going
向指定的构建命令添加“继续运行”选项。

此选项目前支持 makexcodebuild

这是一个方便的选择; 可以直接使用构建选项指定此行为。

-vscan-build 和分析器的详细输出。第二和第三“-v”增加更多输出,给分析器报告 bugs 是有用的。
-V当构建命令完成时,在浏览器中查看分析结果。
--use-analyzer Xcode

--use-analyzer [clang 路径]
scan-build 使用相对于其本身的“clang”可执行文件(ccc-analyzer、c++-analyzer)进行静态分析。可以通过使用与 Xcode(在 OS X 上)或从 PATH 包装的'clang'。

运行没有参数的 scan-build 可以获得完整的选项列表。

scan-build 的输出

scan-buildi 的输出是一组 HTML 文件,每个文件代表一个单独的错误报告。生成单个 index.html 文件用于调查所有错误。然后,您可以在浏览器中打开 index.html 查看错误报告。

生成 HTML 文件的位置使用扫描构建的-o选项指定。如果未指定-o,那么将在/tmp下创建目录以存储文件(scan-build 将打印一条消息告诉您它们在哪里)。如果要在构建完成后立即查看报告,请将-V传给 scan-build

推荐使用指南

本节介绍使用分析器的几个建议。

大多数项目可以启用“调试”模式进行编译,启用断言。断言由静态分析器拾取以修剪不可行路径,这在某些情况下可以大大减少由工具触发的误报(误判的错误报告)的数量。

另一个选项是使用 scan-build 工具的--force-analyze-debug-code标志,这将自动启用断言。

在调试 scan-build 时使用详细输出

scan-build 使用-v选项来触发关于它正在执行的详细输出; 两个-v选项发出更多信息。将 scan-build 的输出重定向到文本文件(确保重定向标准错误)给 scan-build 或分析器 报告 bugs 非常有用,因为我们可以看到传递给分析器的确切选项(和文件)。对于更易于理解的日志,不要执行并行构建。(那太慢了!这是个挑战:并行 + 日志排序)

如果分析的项目使用 autoconf 生成的配置脚本,您可能需要通过 scan-build 运行 configure 脚本以分析项目。但 checking if /usr/bin/../lib/clang/ccc-analyzer is sufficient to build libc... no configure: error: *** These critical programs are missing or too old: compilerLLVMBUG-31017

例子

$ scan-build ./configure
$ scan-build make

configure 还需要通过 scan-build 运行的原因是因为 scan-build 通过插入编译器扫描您的源文件。这个插值目前通过 scan-build 临时将环境变量 CC 设置为 ccc-analyzer 来完成。程序 ccc-analyzer 就像一个假的编译器,它的命令行参数转发到编译器执行常规编译 clang 执行静态分析。

运行 configure 通常生成和编译器相关的绝对路径的 Makefile,并且通过 scan-build 运行 configure 将该路径设置为 ccc-analyzer

Analyzing iPhone Projects

Conceptually Xcode projects for iPhone applications are nearly the same as their cousins for desktop applications. scan-build can analyze these projects as well, but users often encounter problems with just building their iPhone projects from the command line because there are a few extra preparative steps they need to take (e.g., setup code signing).

Recommendation: use "Build and Analyze"

The absolute easiest way to analyze iPhone projects is to use the Analyze feature in Xcode (which is based on the Clang Static Analyzer). There a user can analyze their project right from a menu without most of the setup described later.

Instructions are available on this website on how to use open source builds of the analyzer as a replacement for the one bundled with Xcode.

Using scan-build directly

If you wish to use scan-build with your iPhone project, keep the following things in mind:

Note that you can most of this without actually modifying your project. For example, if your application targets iPhoneOS 2.2, you could run scan-build in the following manner from the command line:

$ scan-build xcodebuild -configuration Debug -sdk iphonesimulator2.2
Alternatively, if your application targets iPhoneOS 3.0:
$ scan-build xcodebuild -configuration Debug -sdk iphonesimulator3.0

Gotcha: using the right compiler

Recall that scan-build analyzes your project by using a compiler to compile the project and clang to analyze your project. The script uses simple heuristics to determine which compiler should be used (it defaults to clang on Darwin and gcc on other platforms). When analyzing iPhone projects, scan-build may pick the wrong compiler than the one Xcode would use to build your project. For example, this could be because multiple versions of a compiler may be installed on your system, especially if you are developing for the iPhone.

When compiling your application to run on the simulator, it is important that scan-build finds the correct version of gcc/clang. Otherwise, you may see strange build errors that only happen when you run scan-build.

scan-build provides the --use-cc and --use-c++ options to hardwire which compiler scan-build should use for building your code. Note that although you are chiefly interested in analyzing your project, keep in mind that running the analyzer is intimately tied to the build, and not being able to compile your code means it won't get fully analyzed (if at all).

If you aren't certain which compiler Xcode uses to build your project, try just running xcodebuild (without scan-build). You should see the full path to the compiler that Xcode is using, and use that as an argument to --use-cc.