所有者:facebook
使用場景: 在釋出前檢測 iOS 和 Android 應用的問題
About Infer
Infer 是一個靜態分析工具。Infer 可以分析 Objective-C, Java 或者 C 程式碼,報告潛在的問題。
任何人都可以使用 Infer 檢測應用,這可以將那些嚴重的 bug 扼殺在釋出之前,同時防止應用崩潰和效能低下。
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支援的編譯器有如下幾種:
在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…專案中我們更常用到的方式是修改單個檔案,然後檢測。 比如我檢測出了這樣的問題:
然後我去程式碼修正了這個問題:
執行:
xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator clean
然後看終端,問題就修復了。
2:如果編譯過程出現‘AttributeError: ‘NoneType’ object has no attribute ‘encode’’
解決辦法:1,pwd檢視你當前目錄,應該在工程所在目錄下,而不是圖上使用者目錄。
2,猴塞雷,請關注你的額程式碼,可能有錯誤。