一、infer简介
1、引言
Infer 是Facebook 开源一款静态分析工具。
Infer 可以分析 Objective-C, Java 或者 C 代码,重点作用于分析APP(Android/iOS)项目,报告潜在的问题。
Infer 已经成为 Facebook 开发流程的一个环节,包括 Facebook Android 和 iOS 主客户端,Facebook Messenger, Instagram 在内的,以及其他影响亿万用户的手机应用
2、Infer捕捉的bug类型:
- Java中捕捉的bug类型
Resource leak
Null dereference
- C/OC中捕捉的bug类型
Resource leak
Memory leak
Null dereference
Premature nil termination argument
- 只在 OC中捕捉的bug类型
Retain cycle
Parameter not null checked
Ivar not null checked
3、infer基本原理
Infer 运行时,分为两个主要阶段:
-
捕获阶段
Infer 捕获编译命令,将文件翻译成 Infer 内部的中间语言。
这种翻译和编译类似,Infer 从编译过程获取信息,并进行翻译。这就是我们调用 Infer 时带上一个编译命令的原因了,比如:
`infer -- clang -c file.c`, `infer -- javac File.java`
。结果就是文件照常编译,同时被 Infer 翻译成中间语言,留作第二阶段处理。特别注意的就是,如果没有文件被编译,那么也没有任何文件会被分析。
-
分析阶段
-
在分析阶段,Infer 分析
infer-out/
下的所有文件。分析时,会单独分析每个方法和函数。
在分析一个函数的时候,如果发现错误,将会停止分析,但这不影响其他函数的继续分析。
-
所以你在检查问题的时候,修复输出的错误之后,需要继续运行 Infer 进行检查,知道确认所有问题都已经修复。
-
错误除了会显示在标准输出之外,还会输出到文件
infer-out/bug.txt
中,我们过滤这些问题,仅显示最有可能存在的。 -
在结果文件夹中(
infer-out
),同时还有一个 csv 文件report.csv
,这里包含了所有 Infer 产生的信息,包括:错误,警告和信息。
-
二、linux下的安装
1、infer的下载及安装(参照官网)
2、配置环境变量
3、检查是否安装成功
4、依赖的安装-opam
wget https://github.com/ocaml/opam/releases/download/1.2.2/opam-1.2.2-x86_64-Linux
sudo cp opam-1.2.2-x86_64-Linux /usr/local/bin/opam
初始化opam:
./opam init --comp=4.02.3
并根据提示输入如下命令:
eval `opam config env`
然后安装相关依赖
opam install sawja.1.5 atdgen.1.5.0 javalib.2.3 extlib.1.5.4
三、Maven工程的扫描
进入工程根目录,扫描maven项目
infer -- mvn -DskipTests=true clean package
结果输出:
空指针异常(可以正常捕获):
结果目录在infer-out文件夹下,主要查看bugs.txt文件