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

