安装
依赖Python >= 2.7
使用brew进行安装brew install infer
配置环境变量
vim ~./bash_profile
export PATH=${PATH}:/usr/local/Cellar/infer
扫描项目
- 扫描android 项目
扫描命令infer -- ./gradlew build
如果代码有问题会输出一系列的问题,如果你没有改变任何文件,运行 Infer 进行检测,并没有进行分析。
这时因为 gradle 是增量的编译的。所有已经编译过的文件没有变动的文件将不会再编译。Infer 根据编译命令获取需要分析的文件,因此,这样的情况下,获取不到任何需要编译分析和分析的文件。
解决方法:
方法1:在两次分析之间运行 ./gradlew clean
方法2:在增量模式下运行infer: infer --incremental -- ./gradlew build
- 扫描ios项目
扫描命令:infer -- xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator
和gradle 相似,需要使用 --incremental (或 -i) 使得增量编译有结果输出。
方法1:在两次分析之间运行xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator clean
方法2:在增量模式下运行infer:infer --incremental -- xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator
infer运行的两个阶段
- 1、捕获阶段
infer捕获编译命令,将文件翻译成infer内部的中间语言,infer从编译过程中获取信息,并进行翻译,这就是调用infer时带上一个编译命令。(infer将编译的语言翻译成自己的中间语言),infer把这个中间语言放在文件夹中,这个文件夹在文件目录下创建,命名是infer-out/ - 2、分析阶段
在分析阶段,Infer 分析 infer-out/ 下的所有文件。分析时,会单独分析每个方法和函数。
在分析一个函数的时候,如果发现错误,将会停止分析,但这不影响其他函数的继续分析。
所以你在检查问题的时候,修复输出的错误之后,需要继续运行 Infer 进行检查,知道确认所有问题都已经修复。
错误除了会显示在标准输出之外,还会输出到文件 infer-out/bug.txt 中,我们过滤这些问题,仅显示最有可能存在的。
在结果文件夹中(infer-out),同时还有一个 csv 文件 report.csv,这里包含了所有 Infer 产生的信息,包括:错误,警告和信息。
增量模式和非增量模式
运行时,infer会默认删除之前产生的infer-out/文件,这会导致非增量模式
如果需要增量模式,加入–incremental(或者 -i)参数运行,这样infer-out/文件夹将不会被删除
- 增量模式
infer目前支持的编译系统,对于某个特定系统可以使用infer --help – 了解具体信息
Gradle
infer -- gradle <gradle task, e.g. "build">
infer -- ./gradlew <gradle task, e.g. "build">
Buck
infer -- buck <buck target>
Maven
infer -- mvn <maven target>
Xcodebuild
Infer 可是分析使用 xcodebuild 构建的应用,但是只分析 .m 和 .c 文件,其他的文件,比如:.cpp,.cc,.mm 文件会被忽略。
infer -- xcodebuild -target <target name> -configuration <build configuration> -sdk iphonesimulator
- 非增量模式
非增量模式适用于单编译命令,重复运行infer检测的情况
如果需要全新一轮的分析,必须
1、删除结果文件夹
rm -fr infer-out
2、删除构建产物
gradlew clean
- 查看报告的详细信息
infer -- xcodebuild -target <target name> -configuration <build configuration> -sdk
iphonesimulator
分析结果
分析结果会被保存在默认的文件夹中infer-out/
infer-out
├── captured/
├── log/
├── multicore/
├── sources/
├── specs/
├── bugs.txt
├── procs.csv
├── report.csv
├── report.json
└── stats.json
- captured/ 包含了 Infer 分析需要的每个文件的信息.
- log/, multicore/, 和 sources/文件夹是分析器内部驱动所需。
- specs/ 包含了所分析的各个方法的 参数指标,Infer 据此推断文件。
- bugs.txt, report.csv, 和 report.json 为三种不同格式的分析结果。
- procs.csv and stats.json 包含debug 信息的分析结果。
捕获文件夹:
每个被捕获进行分析的文件在 infer-out/captured 下都有一个对应的文件夹。比如有一个文件名为 example.c,那么便会有一个文件夹 infer-out/captured/example.c/:
example.c.cfg
example.c.cg
example.c.tenv
.cfg, .cg 和 .tenv 后缀的文件包含了所分析文件的中间表示,这些数据传送给 Infer 的后端程序进行分析。 这些文件包含了序列化后的 OCaml 数据结构。.cfg 文件包含了代码文件中每个函数或方法的控制流程。.cg 包含了代码文件中定义的函数的调用关系,以及该文件对外部函数的调用关系。 .tenv 包含了代码文件中定义和用到的类型。