infer 靜態(tài)掃描

隨著業(yè)務(wù)迭代,完全依靠人工保證代碼質(zhì)量變得很不靠譜攻晒,所以靜態(tài)分析工具變得很重要班挖;通過靜態(tài)語法分析能夠找出在代碼層面就能發(fā)現(xiàn)的內(nèi)存泄露問題,還可以通過上下文分析出是否存在變量無用等問題给梅。但是Xcode自帶的Analyze 的功能還是有限双揪,所以渔期,這才誕生出了功能更全渴邦、定制化高拘哨、效率高的第三方靜態(tài)檢查工具,如OCLint瓮床、Infer产镐、Clang 靜態(tài)分析器等癣亚;

綜合來看,Infer 在準(zhǔn)確性逃糟、性能效率绰咽、規(guī)則、擴展性取募、易用性整體度上的把握是做得最好的玩敏;


infer是Facebook 的 一個靜態(tài)分析工具≈簦可以分析 Objective-C砰粹, Java 或者 C 代碼,報告潛在的問題弄痹。

infer-項目地址為https://github.com/facebook/inferinfer-

中文網(wǎng)站https://infer.liaohuqiu.net

安裝infer可以參考文檔https://github.com/facebook/infer/blob/master/INSTALL.md

使用源碼安裝所需的時間會比較長嵌器,直接安裝 binary releases 會更快些爽航,在終端輸入:brew install infer

理論基礎(chǔ)

首先庇谆,infer是基于分離邏輯(Separation logic)和Bi-abduction 來實現(xiàn)的

那是什么是分離邏輯呢?凭疮??

分離邏輯是霍爾邏輯的一種擴展.霍爾邏輯是廣泛應(yīng)用的程序驗證邏輯系統(tǒng),用于對命令式語言程序 進行推理驗證.

基本思想是:在代碼段及其調(diào)用者之間構(gòu)建一種合同似的規(guī)格說明,由一個前置條件和一個后 置條件構(gòu)成.前置條件是一個斷言,描述這個代碼段執(zhí)行前程序狀態(tài)必須滿足的條件;后置條件也是一個斷言, 描述在代碼段正確運行后程序狀態(tài)所需要滿足的條件,調(diào)用者可以確信在代碼段執(zhí)行結(jié)束后這個狀態(tài)條件 為真串述。 在分離邏輯中,前置條件和后置條件中的程序狀態(tài)主要由棧S和堆H構(gòu)成,棧是變量到值的映射,而堆是有限的地址集合到值的映射.在程序驗證時,可以將椫唇猓看作對寄存器內(nèi)容的描述,而堆是對可尋址內(nèi)存內(nèi)容的描述.

分離邏輯簡而言之是推斷出存儲的獨立小部分的一種理論,從而不用考慮每一步存儲的完整性纲酗。因為考慮每一步的存儲完整性對當(dāng)今的大型可尋址虛擬內(nèi)存處理器來說工作量太龐大

infer 工作原理

  • 第一階段是轉(zhuǎn)化衰腌,將源碼轉(zhuǎn)成infer內(nèi)部中間語言。c語言使用clang編譯觅赊,Java語言使用javac編譯右蕊,編譯同時轉(zhuǎn)成中間語言,輸出到infer-out目錄吮螺;
  • 第二階段分析階段,分析infer-out目錄下文件每個方法鸠补,如果出現(xiàn)錯誤繼續(xù)分析下一個方法萝风,不會被中斷,但會記錄出錯位置紫岩,然后將所有出錯地方匯總輸出规惰;

infer 使用

  • 分析單個文件 infer -- clang -c Hello.m
    實際用這個命令去分析單個文件時報錯,懷疑是infer對最新的xcode兼容有問題泉蝌;

  • 分析整個工程

infer --keep-going --no-xcpretty -- xcodebuild -workspace xxx.xcworkspace -scheme xxx -configuration Debug -sdk iphonesimulator

試了好多命令歇万,這個可以分析完成,看分析結(jié)果bugs.txt文件

結(jié)果分析

在自己的工程目錄下會生成infer-out 文件夾勋陪,所有的問題都收錄在bugs.txt 中

image
image

問題類型匯總

  • DEAD_STORE 未使用的變量

  • DIRECT__ATOMIC_PROPERTY_ACCESS 原子屬性直接訪問贪磺,在代碼中使用了使用了一個atomic的成員變量,infer建議我們將atomic修改為nonatomic

  • ASSIGN___POINTER_WARNING assign修飾指針诅愚, 由于在mrc時代缘挽,沒有weak指針,所以一些view的屬性聲明是呻粹、unsafe__unretain_的形式壕曼,在arc中,這個屬性被判斷為assign等浊,需要將其修改為weak或者strong

  • NULL_DEREFERENCE

空指針的情況腮郊。根據(jù)具體代碼的不同,出現(xiàn)空指針的情況也有所不同筹燕。1.傳參為0的情況下轧飞。例如代碼中衅鹿,在調(diào)用showAlertViewA()時,將tag傳參為0,infer檢測此處傳0过咬,判斷為一個NULL空指針大渤,所以爆出警告。這里可以理解為誤報掸绞,不會出現(xiàn)問題泵三。2.通過malloc,calloc,realloc等函數(shù)申請內(nèi)存,當(dāng)內(nèi)存不足時衔掸,有可能會在該函數(shù)中返回NULL烫幕,如果沒有做NULL的判斷,則警告3.在創(chuàng)建NSArray或者NSDictionary時敞映,傳入的參數(shù)有可能會nil较曼。由于NSArray與NSDictionary不接受空指針,所以在對其addObject或者setObject:forKey: 時需要進行判斷一下是否為nil振愿。

  • POINTER__TO_CONST_OBJC_CLASS const錯誤用法

  • STRONG_DELEGATE_WARNING 將一個delegate屬性設(shè)置為strong的類型

  • PREMATURE_NIL_TERMINATION_ARGUMENT 提前nil終止

  • REGISTERED_OBSERVER_BEING_DEALLOCATED 監(jiān)聽沒有釋放捷犹,創(chuàng)建一個對象后,監(jiān)聽了某些通知冕末,但是沒有在dealloc中釋放該通知伏恐。項目中出現(xiàn)這種問題的類,基本都是單例栓霜,不會被銷毀

  • PARAMETER_NOT_NULL_CHECKED 參數(shù)非空檢查

  • MEMORY_LEAK 內(nèi)存泄露翠桦。項目代碼全面啟動了ARC進行內(nèi)存管理,在OC層沒有掃描出內(nèi)存泄露胳蛮。目前掃描出的內(nèi)存泄露問題都是使用了malloc或者ralloc等c語言內(nèi)存申請函數(shù)销凑,在函數(shù)提前return前沒有及時free

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市仅炊,隨后出現(xiàn)的幾起案子斗幼,更是在濱河造成了極大的恐慌,老刑警劉巖抚垄,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜕窿,死亡現(xiàn)場離奇詭異,居然都是意外死亡呆馁,警方通過查閱死者的電腦和手機桐经,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浙滤,“玉大人阴挣,你說我怎么就攤上這事》睦埃” “怎么了畔咧?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵茎芭,是天一觀的道長。 經(jīng)常有香客問我誓沸,道長梅桩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任拜隧,我火速辦了婚禮宿百,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘虹蓄。我一直安慰自己,他們只是感情好幸撕,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布薇组。 她就那樣靜靜地躺著,像睡著了一般坐儿。 火紅的嫁衣襯著肌膚如雪律胀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天貌矿,我揣著相機與錄音炭菌,去河邊找鬼。 笑死逛漫,一個胖子當(dāng)著我的面吹牛黑低,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酌毡,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼克握,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了枷踏?” 一聲冷哼從身側(cè)響起菩暗,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旭蠕,沒想到半個月后停团,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡掏熬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年佑稠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旗芬。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡讶坯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出岗屏,到底是詐尸還是另有隱情辆琅,我是刑警寧澤漱办,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站婉烟,受9級特大地震影響娩井,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜似袁,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一洞辣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧昙衅,春花似錦扬霜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至啼县,卻和暖如春材原,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背季眷。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工余蟹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人子刮。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓威酒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挺峡。 傳聞我的和親對象是個殘疾皇子兼搏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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