简介
Infer是Facebook最新开源的静态程序分析工具,用于在发布移动应用之前对代码进行分析,找出潜在的问题。目前Facebook使用此工具分析Facebook的App,包括Android、iOS、Facebook Messenger和Instagram等。
Facebook称该工具帮助其每个月检查出应用潜在的数百个Bug,例如一些空指针访问、资源和内存泄漏等。Infer支持Android的Java和iOS的C和Objective-C代码。
官方地址
https://github.com/facebook/infer
安装步骤
(官方手册:https://github.com/facebook/infer/blob/master/INSTALL.md#pre-compiled-versions)
以下是我摸索过后,成功安装及步骤,期间在安装opam时被折磨了很久...
-
下载源码(注意不要有中文路径名)
源码下载地址:https://github.com/facebook/infer/releases/tag/v0.9.0
如下图,选择osx最新的安装包并下载
安装opam
brew install opam
- config
3.1 将第一步下载的tar.xz文件解压
3.2 进入解压后的文件夹
3.3 依次执行以下命令
opam update #这个时间比较长
opam pin add --yes --no-action infer .
opam install --deps-only infer
执行过程中如果提示merlin没有安装,需要依次执行以下命令
opam pin add -y merlin 'https://github.com/the-lambda-church/merlin.git#reason-0.0.1'
opam pin add -y merlin_extend 'https://github.com/let-def/merlin-extend.git#reason-0.0.1'
opam pin add -y reason 'https://github.com/facebook/reason.git#0.0.6'
./autogen.sh
./configure
make # or make java
将这个目录拷贝到一个不常被修改的地方,执行以下命令,添加到环境变量
echo "export PATH="$PATH:pwd/infer/infer/bin"" >> ~/.bash_profile && source ~/.bash_profile
命令执行过程中,如果遇到错误:fatal error: 'stdio.h' file not found,这是因为xcode-comand-line 没有安装好,执行脚本安装
xcode-select --install
安装成功提示:
Infer使用
分析iOS代码
参考地址:http://infer.liaohuqiu.net/docs/analyzing-apps-or-projects.html
分析xcode代码(源码路径不能有中文)
首先用cd命令进入ios_hello目录,然后运行以下命令进行编译
infer — xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator
注意: 其中HelloWorldApp是你的项目名称
编译结果
1: 在项目所在目录下多出build和infer-out文件夹
编译后
build文件夹:捕获阶段: Infer 捕获编译命令(上面介绍的编译器命令),将文件翻译成 Infer 内部的中间语言。运行环境和设备信息也有所体现。
infer-out文件夹:分析阶段产生的文件,Infer将分析bugs结果输出到不同格式文件中,如csv、txt、json 方便对分析结果进行加工分析。
2: 运行后在终端会看到大量日志信息(同infer-out文件,可以以多种形式查看log信息)
代码分析
增量模式和非增量模式
在第一次运行的时候,两种模式是一样的,都会对工程的所有文件进行编译检查,产生检查结果:
增量模式:当已经产生分析结果后(build和infer-out文件夹),再执行编译命令,即为增量模式。如有代码没有改动,则此次不会有编译结果产生,如果代码有新的改动,此次只产生新的编译结果。这种以增量为基准的原则叫做增量模式。
非增量模式:在删除了俩个文件夹的情况下,运行文件,会输出所有的编译信息,即此时处于非增量模式。
增量模式和非增量模式的转化
1:简单粗暴的做法是删除文件夹,即增量->非增量
2:科学的做法是这样的:xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator clean
,以保证增量->非增量状态