使用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

Tags: