iOS代碼檢測(cè)之infer

infer是Facebook 的 Infer 是一個(gè)靜態(tài)分析工具褐耳⌒菜铮可以分析 Objective-C骑脱, Java 或者 C 代碼菜枷,報(bào)告潛在的問題。

任何人都可以使用 infer 檢測(cè)應(yīng)用叁丧,可以將嚴(yán)重的 bug 扼殺在發(fā)布之前啤誊,同時(shí)防止應(yīng)用崩潰和性能低下。


857497-20190801054347120-1549571806.png

infer 可以檢查 Java 和 Android 中的 NullPointException 和資源泄漏拥娄。

除了以上蚊锹,infer 還可以檢測(cè) iOS 和 C 代碼的內(nèi)存泄漏!

應(yīng)用范圍:

包括 Facebook Android 和 iOS 主客戶端稚瘾,F(xiàn)acebook Messenger牡昆, Instagram 在內(nèi)的,以及其他影響億萬用戶的手機(jī)應(yīng)用摊欠,每次代碼變更丢烘,都要經(jīng)過 Infer 的檢測(cè)柱宦。

infer 優(yōu)點(diǎn):

1、效率高播瞳、規(guī)模大捷沸,幾分鐘能掃描上千行代碼;

2狐史、支持增量及非增量分析痒给;

3、分解分析骏全,輸出整合結(jié)果(infer能將代碼分解苍柏,小范圍分析后再將結(jié)果整合在一起,兼顧分 析的深度和速度) 姜贡;

在 iOS 和 C 中试吁,infer 能捕捉的 bug 類型有:

1、資源泄漏楼咳;

2熄捍、內(nèi)存泄漏;

3母怜、null 引用余耽;

4、Premature nil termination argument

只在 OC 中捕捉的 bug 類型有:

1苹熏、循環(huán)引用(Retain cycle)碟贾;

2、參數(shù)非空檢查轨域;

3袱耽、實(shí)例變量非空檢查;

Github 地址:https://github.com/facebook/infer

infer安裝

brew install infer

代碼檢測(cè)

1干发、分析單個(gè)文件

infer -- clang -c xxx.m

2朱巨、分析工程
非Pod工程

infer -- xcodebuild -target XXX -configuration Debug -sdk iphonesimulator

Pod工程
infer -- xcodebuild -workspace xxx.xcworkspace -scheme "xxx"

3、添加靜態(tài)分析工具忽略文件
在工程目錄下新建 .inferconfig 文件

touch .inferconfig

修改.inferconfig枉长,添加過濾選項(xiàng)

{
    "skip-analysis-in-path":["Pods"]
}

過濾掉Pods文件夾, skip-analysis-in-path是一個(gè)數(shù)組, 想要過濾其他文件, 只需要增加路徑即可

出現(xiàn)常見錯(cuò)誤類型有:

1冀续、NULL_DEREFERENCE:空指針的情況。

1.傳參為0的情況下搀暑。例如代碼中沥阳,在調(diào)用showAlertViewA()時(shí)跨琳,將tag傳參為0,infer檢測(cè)此處傳0自点,判斷為一個(gè)NULL空指針,所以爆出警告脉让。這里可以理解為誤報(bào)桂敛,不會(huì)出現(xiàn)問題功炮。

2.通過malloc,calloc,realloc等函數(shù)申請(qǐng)內(nèi)存,當(dāng)內(nèi)存不足時(shí)术唬,有可能會(huì)在該函數(shù)中返回NULL薪伏,如果沒有做NULL的判斷,則警告

3.在創(chuàng)建NSArray或者NSDictionary時(shí)粗仓,傳入的參數(shù)有可能會(huì)nil嫁怀。由于NSArray與NSDictionary不接受空指針,所以在對(duì)其addObject或者setObject:forKey: 時(shí)需要進(jìn)行判斷一下是否為nil

2借浊、MEMORY_LEAK:內(nèi)存泄漏:
     項(xiàng)目代碼全面啟動(dòng)了ARC進(jìn)行內(nèi)存管理塘淑,在OC層沒有掃描出內(nèi)存泄露。目前掃描出的內(nèi)存泄露問題都是使用了malloc或者ralloc等c語言內(nèi)存申請(qǐng)函數(shù)蚂斤,在函數(shù)提前return前沒有及時(shí)free
    3存捺、RESOURCE_LEAK:資源泄漏
    4、ASSIGN_POINTER_WARNING
      由于在mrc時(shí)代曙蒸,沒有weak指針捌治,所以一些view的屬性聲明是、unsafe__unretain_的形式纽窟,在arc中肖油,這個(gè)屬性被判斷為assign,需要將其修改為weak或者strong
    5臂港、DIRECT_ATOMIC_PROPERTY_ACCESS
      在代碼中使用了使用了一個(gè)atomic的成員變量构韵,infer建議我們將atomic修改為nonatomic。由于OC中趋艘,屬性會(huì)被默認(rèn)設(shè)置為atomic屬性疲恢,我們需要顯示將屬性聲明為nonatomic。

6瓷胧、IVAR_NOT_NULL_CHECKED

在代碼中調(diào)用block显拳,運(yùn)行代碼時(shí),沒有做判空處理搓萧。即需要改動(dòng)為杂数,if(block){block()}

7、BAD_POINTER_COMPARISON

沒有判斷一個(gè)NSNumber類型的對(duì)象是不是空瘸洛?

8揍移、TAINTED_VALUE_REACHING_SENSITIVE_FUNCTION

代碼中使用了cookie的value》蠢撸可以理解為誤報(bào)

9那伐、PARAMETER_NOT_NULL_CHECKED

傳參時(shí)沒有判斷是否為null,加一次判斷就可以了

10、STRONG_DELEGATE_WARNING

將一個(gè)delegate屬性設(shè)置為strong的類型罕邀。

11畅形、PREMATURE_NIL_TERMINATION_ARGUMENT

沒有判斷是否為空

12、REGISTERED_OBSERVER_BEING_DEALLOCATED

創(chuàng)建一個(gè)對(duì)象后诉探,監(jiān)聽了某些通知日熬,但是沒有在dealloc中釋放該通知。項(xiàng)目中出現(xiàn)這種問題的類肾胯,基本都是單例竖席,不會(huì)被銷毀。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末敬肚,一起剝皮案震驚了整個(gè)濱河市怕敬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌帘皿,老刑警劉巖东跪,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鹰溜,居然都是意外死亡虽填,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門曹动,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斋日,“玉大人,你說我怎么就攤上這事墓陈《袷兀” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵贡必,是天一觀的道長(zhǎng)兔港。 經(jīng)常有香客問我,道長(zhǎng)仔拟,這世上最難降的妖魔是什么衫樊? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮利花,結(jié)果婚禮上科侈,老公的妹妹穿的比我還像新娘。我一直安慰自己炒事,他們只是感情好蔬顾,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布迄埃。 她就那樣靜靜地躺著滓走,像睡著了一般讼呢。 火紅的嫁衣襯著肌膚如雪姑躲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天崭闲,我揣著相機(jī)與錄音肋联,去河邊找鬼威蕉。 笑死刁俭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的韧涨。 我是一名探鬼主播牍戚,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼虑粥!你這毒婦竟也來了如孝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤娩贷,失蹤者是張志新(化名)和其女友劉穎第晰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彬祖,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茁瘦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了储笑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甜熔。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖突倍,靈堂內(nèi)的尸體忽然破棺而出腔稀,到底是詐尸還是另有隱情,我是刑警寧澤羽历,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布焊虏,位于F島的核電站,受9級(jí)特大地震影響秕磷,放射性物質(zhì)發(fā)生泄漏炕淮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一跳夭、第九天 我趴在偏房一處隱蔽的房頂上張望涂圆。 院中可真熱鬧,春花似錦币叹、人聲如沸润歉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽踩衩。三九已至嚼鹉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驱富,已是汗流浹背锚赤。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留褐鸥,地道東北人线脚。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像叫榕,于是被迫代替她去往敵國(guó)和親浑侥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

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