使用facebook的infer检查Android代码缺陷

  • 2020 年 3 月 16 日
  • 笔记

背景

Infer 是一个静态分析工具,它能在 Android 和 iOS 的编译过程中今夕代码分析,发现缺陷。使用起来也很简单方便。

什么是 Infer?

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

开始使用

1.下载地址

https://github.com/facebook/infer/releases/

下载完成后时个压缩包,解压后放到磁盘某个位置,记下路径。

2.配置到环境变量

将上一步的路径(可执行文件所在的路径)配置到环境变量

  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();      }    }

3.执行缺陷检查,检查Android工程

infer -- ./gradlew build

这里执行了 gradle 的构建,不过它以 infer 开头的指令,在构建过程中 infer 会捕获并进行缺陷检查。

4.查看检查报告

image.png

可以看到上图中的红字部分了指示了可能的代码缺陷。

Infer 的工作机制

1. 捕获阶段

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

2. 分析阶段

在分析阶段,Infer 分析 infer-out/ 下的所有文件。分析时,会单独分析每个方法和函数。

在分析一个函数的时候,如果发现错误,将会停止分析,但这不影响其他函数的继续分析。

所以你在检查问题的时候,修复输出的错误之后,需要继续运行 Infer 进行检查,知道确认所有问题都已经修复。

错误除了会显示在标准输出之外,还会输出到文件 infer-out/bug.txt 中,我们过滤这些问题,仅显示最有可能存在的。

在结果文件夹中(infer-out),同时还有一个 csv 文件 report.csv,这里包含了所有 Infer 产生的信息,包括:错误,警告和信息。

参考

官网地址:https://infer.liaohuqiu.net https://infer.liaohuqiu.net/docs/hello-world.html