一、Infer 安装
brew install infer
二、Infer 使用
1、基本使用
infer --xcodebuild -target HelloWorld -configuration Debug -sdk iphonesimulator
HelloWorld 替换成真实target。iphonesimulator 是模拟器编译,真机用iphoneos
2、增量模式和非增量模式
第一次运行的时候,两种模式是一样的,都会对工程的所有文件进行编译检查,产生检查结果:
增量模式:当已经产生分析结果后(build和infer-out文件夹),再执行编译命令,即为增量模式。如有代码没有改动,则此次不会有编译结果产生,如果代码有新的改动,此次只产生新的编译结果。这种以增量为基准的原则叫做增量模式。
非增量模式:在删除了俩个文件夹的情况下,运行文件,会输出所有的编译信息,即此时处于非增量模式。
增量模式转化为非增量模式:
第1种、直接删除文件夹(build和infer-out文件夹)
第2种、先使用xcodebuild clean 清除一下对应的 target 工程,之后再重新编译分析
infer -- xcodebuild -target HelloWorld clean -configuration Debug -sdk iphoneos
3、分析带cocoapods的项目
在工程目录下新建 .inferconfig 文件, 可以过滤掉Pods文件夹下的第三方库, skip-analysis-in-path是一个数组, 想要过滤其他文件, 只需要增加路径即可。
{
"skip-analysis-in-path":["Pods"]
}
4、Infer 工作的流程
第一个阶段是转化阶段,将源代码转成 Infer 内部的中间语言。类 C 语言使用 Clang 进行编译,Java 语言使用 javac 进行编译,编译的同时转成中间语言,输出到 infer-out 目录。
第二个阶段是分析阶段,分析 infer-out 目录下的文件。分析每个方法,如果出现错误的话会继续分析下一个方法,不会被中断,但是会记录下出错的位置,最后将所有出错的地方进行汇总输出。默认情况下,每次运行 infer 命令都会删除之前的 infer-out 文件夹。你可以通过 --incremental 参数使用增量模式。增量模式下,运行 infer 命令不会删除 infer-out 文件夹,但是会利用这个文件夹进行 diff,减少分析量。一般进行全新一轮分析时直接使用默认的非增量模式,而对于只想分析修改部分情况时,就使用增量模式。
Infer 检查的结果,在 infer-out 目录下,是 JSON 格式的,名字叫做 report.json 。生成 JSON 格式的结果,通用性会更强,集成到其他系统时会更方便。Infer 的工作流程图如下: