infer使用的淺談簡析

發表於2016-03-30

所有者:facebook

使用場景: 在釋出前檢測 iOS 和 Android 應用的問題

About Infer


Infer 是一個靜態分析工具。Infer 可以分析 Objective-C, Java 或者 C 程式碼,報告潛在的問題。

任何人都可以使用 Infer 檢測應用,這可以將那些嚴重的 bug 扼殺在釋出之前,同時防止應用崩潰和效能低下。

infer分析圖

Infer特性


Android 和 Java

Infer 可檢查 Android 和 Java 程式碼中的 NullPointException 和 資源洩露。

iOS

除了以上,Infer 還可發現 iOS 和 C 程式碼中的記憶體洩露,記憶體洩露,記憶體洩露。

Infer適用範圍


包括 Facebook Android 和 iOS 主客戶端,Facebook Messenger, Instagram 在內的,以及其他影響億萬使用者的手機應用,每次程式碼變更,都要經過 Infer 的檢測。

Infer優點


1:效率高,規模大,幾分鐘能掃描數千行程式碼;

2:支援增量及非增量分析(後邊會解釋)

3:分解分析,整合輸出結果。(infer能將程式碼分解,小範圍分析後再將結果整合在一起,兼顧分析的深度和速度)

Infer捕捉的bug型別


C/OC中捕捉的bug型別

1:Resource leak

2:Memory leak

3:Null dereference

4:Premature nil termination argument

只在 OC中捕捉的bug型別

1:Retain cycle

2:Parameter not null checked

3:Ivar not null checked

Infer安裝


Infer為Linux和MacOS系統提供了預構建的二進位制檔案,如果你只是想使用Infer,而不想為該專案貢獻程式碼的話,這些二進位制檔案足夠了.相反,如果你想編譯infer,請選擇原始碼安裝。此文件以Mac系統,原始檔安裝為栗子。

環境要求

Python版本:大於等於2.7

第一種:二進位制檔案安裝

infer release頁面獲取最新版本infer-osx-vXX.tar.xz (以osx標識),然後執行下面命令來安裝Infer.

第二種:原始碼安裝

藉助brew安裝

1.1安裝brew

/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

1.2安裝infer

brew install infer

安裝達到100% 後可通過`infer –version`檢視infer版本資訊

1.3配置到環境變數

cd 你的程式碼檔案路徑//建議放到一個不常改動的位置哦)

echo “export PATH=”$PATH:pwd/infer/infer/bin”” >> ~/.bash_profile &&source ~/.bash_profile

執行完如上操作,如果沒報錯你就成功啦!

Git克隆+clang

(網速特別慢就不推薦了,因為倆步操作都很耗時)

2.1遠端克隆git clone https://github.com/facebook/infer.git

2.2外掛安裝

注意:如果要分析C和Objective-C,Infer還需要clang以及facebook-clang-plugin外掛。 facebook-clang-plugin外掛見:facebook-clang-plugin如果只想分析Java/Android程式碼,那麼無需以上的依賴庫

Infer 的使用


facebook/infer demo

目前infer支援的編譯器有如下幾種:

infer能分析的檔案型別

在github上下載demo,demo下examples目錄裡,你會發現有android專案、C語言檔案、java類、oc類、iOS專案,沒錯啦,infer完全支援以上幾種型別的BUG分析。這裡我們用ios_hello專案來做栗子:

首先用cd命令進入ios_hello目錄,然後執行以下命令進行編譯

infer — xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator

注意: 其中HelloWorldApp是你的專案名稱

編譯結果


1: 在專案所在目錄下多出build和infer-out資料夾

編譯後

build資料夾:捕獲階段: Infer 捕獲編譯命令(上面介紹的編譯器命令),將檔案翻譯成 Infer 內部的中間語言。執行環境和裝置資訊也有所體現。

infer-out資料夾:分析階段產生的檔案,Infer將分析bugs結果輸出到不同格式檔案中,如csv、txt、json 方便對分析結果進行加工分析。

2: 執行後在終端會看到大量日誌資訊(同infer-out檔案,可以以多種形式檢視log資訊)

 

程式碼分析

cc

錯誤總結

注意事項總結


1:在倆次執行編譯命令的過程中,發現在沒有對程式碼做任何更改的時候,報出BUILD SUCCEEDED的提示:我懵了!

我懵了

根據提示可以看到,此次build並沒有分析任何檔案。原因就是上面所提到的增量分析。

增量模式和非增量模式

在第一次執行的時候,兩種模式是一樣的,都會對工程的所有檔案進行編譯檢查,產生檢查結果:

增量模式:當已經產生分析結果後(build和infer-out資料夾),再執行編譯命令,即為增量模式。如有程式碼沒有改動,則此次不會有編譯結果產生,如果程式碼有新的改動,此次只產生新的編譯結果。這種以增量為基準的原則叫做增量模式。

非增量模式:在刪除了倆個資料夾的情況下,執行檔案,會輸出所有的編譯資訊,即此時處於非增量模式。

增量模式和非增量模式的轉化

1:簡單粗暴的做法是刪除資料夾,即增量->非增量

2:科學的做法是這樣的:xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator clean,以保證增量->非增量狀態

but…專案中我們更常用到的方式是修改單個檔案,然後檢測。 比如我檢測出了這樣的問題:

查到bug

然後我去程式碼修正了這個問題:

修改程式碼

執行:

xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator clean

然後看終端,問題就修復了。

2:如果編譯過程出現‘AttributeError: ‘NoneType’ object has no attribute ‘encode’’

encode錯誤

解決辦法:1,pwd檢視你當前目錄,應該在工程所在目錄下,而不是圖上使用者目錄。

2,猴塞雷,請關注你的額程式碼,可能有錯誤。

相關文章