所有者:facebook
使用場景: 在發(fā)布前檢測 iOS 和 Android 應(yīng)用的問題
About Infer
Infer 是一個靜態(tài)分析工具坤邪。Infer 可以分析 Objective-C煤率, Java 或者 C 代碼,報告潛在的問題元媚。
任何人都可以使用 Infer 檢測應(yīng)用,這可以將那些嚴重的 bug 扼殺在發(fā)布之前,同時防止應(yīng)用崩潰和性能低下床蜘。
Infer特性
Android 和 Java
Infer 可檢查 Android 和 Java 代碼中的 NullPointException 和 資源泄露粥诫。
iOS
除了以上油航,Infer 還可發(fā)現(xiàn) iOS 和 C 代碼中的內(nèi)存泄露,內(nèi)存泄露臀脏,內(nèi)存泄露劝堪。
Infer適用范圍
包括 Facebook Android 和 iOS 主客戶端冀自,F(xiàn)acebook Messenger, Instagram 在內(nèi)的秒啦,以及其他影響億萬用戶的手機應(yīng)用熬粗,每次代碼變更,都要經(jīng)過 Infer 的檢測余境。
Infer優(yōu)點
1:效率高驻呐,規(guī)模大,幾分鐘能掃描數(shù)千行代碼芳来;
2:支持增量及非增量分析(后邊會解釋)
3:分解分析含末,整合輸出結(jié)果。(infer能將代碼分解即舌,小范圍分析后再將結(jié)果整合在一起剃幌,兼顧分析的深度和速度)
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系統(tǒng)提供了預(yù)構(gòu)建的二進制文件,如果你只是想使用Infer,而不想為該項目貢獻代碼的話,這些二進制文件足夠了.相反,如果你想編譯infer,請選擇源碼安裝况芒。此文檔以Mac系統(tǒng)么伯,源文件安裝為栗子。
環(huán)境要求
Python版本:大于等于2.7
第一種:二進制文件安裝
從infer release頁面獲取最新版本infer-osx-vXX.tar.xz (以osx標識),然后執(zhí)行下面命令來安裝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配置到環(huán)境變量
cd 你的代碼文件路徑//建議放到一個不常改動的位置哦)
echo "export PATH=\"\$PATH:pwd/infer/infer/bin\"" \ >> ~/.bash_profile &&source ~/.bash_profile
執(zhí)行完如上操作紊搪,如果沒報錯你就成功啦蜜葱!
Git克隆+clang
(網(wǎng)速特別慢就不推薦了耀石,因為倆步操作都很耗時)
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目錄里,你會發(fā)現(xiàn)有android項目诗良、C語言文件汹桦、java類、oc類鉴裹、iOS項目舞骆,沒錯啦,infer完全支持以上幾種類型的BUG分析径荔。這里我們用ios_hello項目來做栗子:
首先用cd命令進入ios_hello目錄督禽,然后運行以下命令進行編譯
infer -- xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator
注意: 其中HelloWorldApp是你的項目名稱
編譯結(jié)果
1: 在項目所在目錄下多出build和infer-out文件夾
build文件夾:捕獲階段: Infer 捕獲編譯命令(上面介紹的編譯器命令),將文件翻譯成 Infer 內(nèi)部的中間語言总处。運行環(huán)境和設(shè)備信息也有所體現(xiàn)狈惫。
infer-out文件夾:分析階段產(chǎn)生的文件,Infer將分析bugs結(jié)果輸出到不同格式文件中鹦马,如csv胧谈、txt忆肾、json?方便對分析結(jié)果進行加工分析。
2: 運行后在終端會看到大量日志信息(同infer-out文件菱肖,可以以多種形式查看log信息)
cc
注意事項總結(jié)
1:在倆次執(zhí)行編譯命令的過程中客冈,發(fā)現(xiàn)在沒有對代碼做任何更改的時候,報出BUILD SUCCEEDED的提示:我懵了稳强!
根據(jù)提示可以看到场仲,此次build并沒有分析任何文件。原因就是上面所提到的增量分析退疫。
增量模式和非增量模式
在第一次運行的時候渠缕,兩種模式是一樣的,都會對工程的所有文件進行編譯檢查褒繁,產(chǎn)生檢查結(jié)果:
增量模式:當已經(jīng)產(chǎn)生分析結(jié)果后(build和infer-out文件夾)亦鳞,再執(zhí)行編譯命令,即為增量模式澜汤。如有代碼沒有改動蚜迅,則此次不會有編譯結(jié)果產(chǎn)生舵匾,如果代碼有新的改動俊抵,此次只產(chǎn)生新的編譯結(jié)果。這種以增量為基準的原則叫做增量模式坐梯。
非增量模式:在刪除了倆個文件夾的情況下徽诲,運行文件,會輸出所有的編譯信息吵血,即此時處于非增量模式谎替。
增量模式和非增量模式的轉(zhuǎn)化
1:簡單粗暴的做法是刪除文件夾,即增量->非增量
2:科學的做法是這樣的:xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator clean蹋辅,以保證增量->非增量狀態(tài)
but...項目中我們更常用到的方式是修改單個文件钱贯,然后檢測。 比如我檢測出了這樣的問題:
然后我去代碼修正了這個問題:
執(zhí)行:
xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator clean
然后看終端侦另,問題就修復(fù)了秩命。
2:如果編譯過程出現(xiàn)‘AttributeError: 'NoneType' object has no attribute 'encode'’
解決辦法:1,pwd查看你當前目錄褒傅,應(yīng)該在工程所在目錄下弃锐,而不是圖上用戶目錄。
? ? ? ? ? ? ? ? 2殿托,猴塞雷霹菊,請關(guān)注你的額代碼,可能有錯誤支竹。