Facebook开源Infer集成iOS代码静态分析
Homebrew安装infer
brew install infer
设置环境变量
echo "export PATH=\"\$PATH:`pwd`/infer/infer/bin\"" \ >> ~/.bash_profile &&
source ~/.bash_profile
依赖组建
如果没有,请使用homebrew安装
Python >= 2.7.
Xcodebuild
xcpretty
推断检测
⚠️ 都需要cd到当前文件/项目
单个文件
infer -- clang -c TTHello.m
单个项目
infer -- xcodebuild -target TTInfer -configuration Debug -sdk iphonesimulator
有pod工程
infer run -- xcodebuild -workspace TTInfer.xcworkspace -scheme TTInfer -configuration Debug -sdk iphonesimulator
编译前清理
xcodebuild -target TTInfer -configuration Debug -sdk iphonesimulator clean
检测成功运行之后,分析结果会被放入一个默认文件夹,infer-out:
infer-out
├── captured/
├── log/
├── multicore/
├── sources/
├── specs/
├── bugs.txt
├── procs.csv
├── report.csv
├── report.json
└── stats.json
1. captured/ 包含了 Infer 分析需要的每个文件的信息.
2. log/, multicore/, 和 sources/ 文件夹是分析器内部驱动所需。
3. specs/ 包含了所分析的各个方法的 参数指标,Infer 据此推断文件。
4. bugs.txt, report.csv, 和 report.json 为三种不同格式的分析结果。
5. procs.csv and stats.json 包含 debug 信息的分析结果.
Infer 工作的流程
第一个阶段是转化阶段,将源代码转成 Infer 内部的中间语言。
类 C 语言使用 Clang 进行编译,Java 语言使用 javac 进行编译,编译的同时转成中间语言,输出到 infer-out 目录。
第二个阶段是分析阶段,分析 infer-out 目录下的文件。分析每个方法,如果出现错误的话会继续分析下一个方法,不会被中断,但是会记录下出错的位置,最后将所有出错的地方进行汇总输出。
默认情况下,每次运行 infer 命令都会删除之前的 infer-out 文件夹。你可以通过 --incremental 参数使用增量模式。增量模式下,运行 infer 命令不会删除 infer-out 文件夹,但是会利用这个文件夹进行 diff,减少分析量。
一般进行全新一轮分析时直接使用默认的非增量模式,而对于只想分析修改部分情况时,就使用增量模式。
使用心得
Infer 的效率高,支持增量分析,可小范围分析。可定制性不算最强,属于中等,一些代码习惯可能会被检测出问题代码,如:
NSString *name = @"";
name = nameArray.firstObject;
...
不过Infer 在准确性、性能效率、规则、扩展性、易用性整体度上的把握是做得最好的,值得推荐
网友评论