Facebook静态代码分析工具Infer介绍
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Facebook静态代码分析工具Infer介绍
作者:暨景书,新炬网络高级技术专家。
随着IT系统的广泛应用,补丁、需求大量变更,版本快速迭代,需要频繁的进行发布,发布管理质量不高,导致故障频繁。如何在上线采取有效措施,将一些潜在的bug扼杀在版本发布之前,优化代码,防止应用的崩溃和性能低下问题,值得我们去探索。
目前行业主要是通过静态代码分析方式,在无需运行被测代码前提下,在构建代码过程中帮助开发人员快速、有效的定位代码缺陷并及时纠正这些问题,从而极大地提高软件可靠性并节省软件开发和测试成本。静态代码分析可以分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等。
Infer是Facebook今年刚开源一款静态分析工具。Infer可以分析Objective-C,Java 或者C代码,重点作用于分析APP(Android/iOS)项目,报告潜在的问题。Infer已经成为 Facebook 开发流程的一个环节,包括Facebook Android和iOS主客户端,Facebook Mes senger,Instagram在内的,以及其他影响亿万用户的手机应用,每次代码变更,都要经过Infer的检测。
先介绍infer相比其它静态分析工具有什么优点:
1、是一款开源静态的代码分析工具;
2、效率高,规模大,几分钟可以扫描数千行代码;
3、支持增量及非增量分析;
4、分解分析,整合输出结果。Infer能将代码分解,小范围分析后再将结果整合在一起,兼顾分析的深度和速度。
Infer捕捉的bug类型:
1.Java中捕捉的bug类型
Resource leak
Null dereference
2.C/OC中捕捉的bug类型
Resource leak
Memory leak
Null dereference
Premature nil termination argument
3.只在 OC中捕捉的bug类型
Retain cycle
Parameter not null checked
Ivar not null checked
Infer官方网站主要是介绍了如何分析APP(Android/iOS)项目及单个java文件,并没有介绍针对整个JAVA项目进行分析。大家都知道,日常中系统都是以多个java文件组成项目方式存在,本次将重点介绍如何利用Infer分析JAVA/Android项目及在部署infer时将会碰到一些问题,以避免大家在研究infer走更多的弯路。
一、Infer 处理流程
Infer将Objective-C(ios)/Java/C开发程序,通过编绎器分析出相应bugs信息,目前infer支持的编译器有如下几种:
编号编译器名称备注
1 javac 分析单个文件
2 clang 分析单个文件
3 make 分析C/C++项目
4 Maven 命令支持,官方无相关资料介绍,测试过无法分析java 项目,
有报错现象,
[ERROR] Error during capture phase, exiting
此错误没有提示具体原因,待官方反馈解决
参考:https:///facebook/infer/issues/182
5 Ant 命令支持,官方无相关资料介绍,亲测出现Maven同样的错误,
待官方反馈解决
6 Gradle 主要用来分析android/JAVA项目
7 Xcodebuild 分析iOS项目
不管你使用哪一种编译器,infer 分析都会经过两种阶段:
1.捕获阶段:Infer 捕获编译命令(上面介绍的编译器命令),将文件翻译成 Infer 内部的中间语言。
2.分析阶段:Infer将分析bugs结果输出到不同格式文件中,如csv、txt、json 方便对分析结果进行加工分析。
二、Infer安装与部署及分析
1.环境要求
操作系统:Ubuntu 14.04 64位,并且安装好对应的桌面,不要使用redhat操作系统(多次测试出现infer有一些包出现无法安装现象)
Python版本:大于等于2.7
JAVA环境:JDK 1.7,不要使用JDK 1.8(测试不支持)
严格按上面要求环境下安装infer,否则只能哈哈了,惨痛的教训。
2.环境安装
官方提供了预编译好的Infer工具,直接下载使用即可,测试过官方提供的最新编译好的版本0.4.0无法正常使用(无法解压)。建议自己通过下载最新源码方式,进行手动编译后,再使用。
1)安装OCaml依赖:
sudo apt-get update #更新ubt 安装源
sudo apt-get upgrade
sudo apt-get install git openjdk-7-jdk m4 zlib1g-dev python-software-proper ties build-essential libgmp-dev libmpfr-dev libmpc-dev unzip #更新OCaml依耐包wget https:///ocaml/opam/releases/download/1.2.2/opam-1.2.2-x86_6 4-Linux -O opam #下载opam
chmod +x opam
./opam init --comp=4.01.0 # 然后在最后一个问题处按下“y”
eval `./opam config env`
./opam install sawja.1.5 atdgen.1.5.0 javalib.2.3 extlib.1.5.4 # 然后在问题处按下“y”
2)下载Infer的仓库
git clone https:///facebook/infer.git
cd infer
make -C infer java