infer使用的淺談簡析

所有者:facebook

使用場景: 在發(fā)布前檢測 iOS 和 Android 應(yīng)用的問題

About Infer


Infer 是一個靜態(tài)分析工具坤邪。Infer 可以分析 Objective-C煤率, Java 或者 C 代碼,報告潛在的問題元媚。

任何人都可以使用 Infer 檢測應(yīng)用,這可以將那些嚴重的 bug 扼殺在發(fā)布之前,同時防止應(yīng)用崩潰和性能低下床蜘。

infer分析圖

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支持的編譯器有如下幾種:

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é)

注意事項總結(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...項目中我們更常用到的方式是修改單個文件钱贯,然后檢測。 比如我檢測出了這樣的問題:

查到bug

然后我去代碼修正了這個問題:

修改代碼

執(zhí)行:

xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator clean

然后看終端侦另,問題就修復(fù)了秩命。

2:如果編譯過程出現(xiàn)‘AttributeError: 'NoneType' object has no attribute 'encode'’

encode錯誤

解決辦法:1,pwd查看你當前目錄褒傅,應(yīng)該在工程所在目錄下弃锐,而不是圖上用戶目錄。

? ? ? ? ? ? ? ? 2殿托,猴塞雷霹菊,請關(guān)注你的額代碼,可能有錯誤支竹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旋廷,一起剝皮案震驚了整個濱河市鸠按,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饶碘,老刑警劉巖待诅,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異熊镣,居然都是意外死亡卑雁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門绪囱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來测蹲,“玉大人,你說我怎么就攤上這事鬼吵】奂祝” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵齿椅,是天一觀的道長琉挖。 經(jīng)常有香客問我,道長涣脚,這世上最難降的妖魔是什么示辈? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮遣蚀,結(jié)果婚禮上矾麻,老公的妹妹穿的比我還像新娘。我一直安慰自己芭梯,他們只是感情好险耀,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著玖喘,像睡著了一般甩牺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上累奈,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天贬派,我揣著相機與錄音,去河邊找鬼费尽。 笑死赠群,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的旱幼。 我是一名探鬼主播查描,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了冬三?” 一聲冷哼從身側(cè)響起匀油,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎勾笆,沒想到半個月后敌蚜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡窝爪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年弛车,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒲每。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡纷跛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出邀杏,到底是詐尸還是另有隱情贫奠,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布望蜡,位于F島的核電站唤崭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏脖律。R本人自食惡果不足惜谢肾,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望状您。 院中可真熱鬧勒叠,春花似錦、人聲如沸膏孟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柒桑。三九已至,卻和暖如春噪舀,著一層夾襖步出監(jiān)牢的瞬間魁淳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工与倡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留界逛,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓纺座,卻偏偏與公主長得像息拜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容