Infer 是一个静态分析工具,它能在 Android 和 iOS 的编译过程中今夕代码分析,发现缺陷。使用起来也很简单方便。
Facebook 的 Infer 是一个静态分析工具。Infer 可以分析 Objective-C, Java 或者 C 代码,报告潜在的问题。
任何人都可以使用 Infer 检测应用,这可以将那些严重的 bug 扼杀在发布之前,同时防止应用崩溃和性能低下。
Infer 是一个静态程序分析工具,可以对 Java、C 和 Objective-C 程序进行分析,此工具是用 OCaml 写成的。
Infer 最早部署在 Facebook 内部,用于发布移动应用之前对每一行代码进行分析,目前 Facebook 使用此工具分析所开发的 Android、iOS 应用,包括 Facebook Messenger、Instagram 和其他一些应用。 Infer 不仅仅用于移动应用程序的分析,还可以分析 C、Java 等不是 Android 系统的代码。 目前 Infer 着重于发现一些诸如空指针的访问、资源和内存的泄露等导致手机程序崩溃或性能严重下降的问题。
官网地址:https://infer.liaohuqiu.net
https://github.com/facebook/infer/releases/
下载完成后时个压缩包,解压后放到磁盘某个位置,记下路径。
将上一步的路径(可执行文件所在的路径)配置到环境变量
export PATH="PATH:xxxxxx/infer/infer/bin"
我的是mac系统,要修改~/.bash_profile 完成后在控制台执行 infer ,可能看到如下:
yunfeideMacBook-Pro:bin zhangyunfei$ infer --version
Infer version v0.15.0
Copyright 2009 - present Facebook. All Rights Reserved.
为了演示,准备一个错误的例子
以下是一个的 Java 例子,可以看到 s 是个空引用。
// Hello.java
class Hello {
int test() {
String s = null;
return s.length();
}
}
infer -- ./gradlew build
这里执行了 gradle 的构建,不过它以 infer 开头的指令,在构建过程中 infer 会捕获并进行缺陷检查。
image.png
可以看到上图中的红字部分了指示了可能的代码缺陷。
Infer 捕获编译命令,将文件翻译成 Infer 内部的中间语言。
这种翻译和编译类似,Infer 从编译过程获取信息,并进行翻译。这就是我们调用 Infer 时带上一个编译命令的原因了,比如: infer -- clang -c file.c, infer -- javac File.java。结果就是文件照常编译,同时被 Infer 翻译成中间语言,留作第二阶段处理。特别注意的就是,如果没有文件被编译,那么也没有任何文件会被分析。
Infer 把中间文件存储在结果文件夹中,一般来说,这个文件夹会在运行 infer 的目录下创建,命名是 infer-out/。当然,你也可以通过 -o 选项来自定义文件夹名字:
infer -o /tmp/out -- javac Test.java
在分析阶段,Infer 分析 infer-out/ 下的所有文件。分析时,会单独分析每个方法和函数。
在分析一个函数的时候,如果发现错误,将会停止分析,但这不影响其他函数的继续分析。
所以你在检查问题的时候,修复输出的错误之后,需要继续运行 Infer 进行检查,知道确认所有问题都已经修复。
错误除了会显示在标准输出之外,还会输出到文件 infer-out/bug.txt 中,我们过滤这些问题,仅显示最有可能存在的。
在结果文件夹中(infer-out),同时还有一个 csv 文件 report.csv,这里包含了所有 Infer 产生的信息,包括:错误,警告和信息。
官网地址:https://infer.liaohuqiu.nethttps://infer.liaohuqiu.net/docs/hello-world.html