安裝Infer
在Mac上可以直接使用brew 來安裝,比較簡單
brew install infer
使用Infer
- Android
infer -- gradle build
- iOS
cd 到你的當(dāng)前工程目錄下
# 普通工程
infer run -- xcodebuild -target xxx -scheme xxx -configuration Debug -sdk iphonesimulator
# pod工程
infer run -- xcodebuild -workspace xxx.xcworkspace -scheme xxx -configuration Debug -sdk iphonesimulator
查看報(bào)告
腳本跑完之后在 infer-out/bugs.txt
查看結(jié)果
出現(xiàn)常見錯(cuò)誤類型有:
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
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
RESOURCE_LEAK:資源泄漏
ASSIGN_POINTER_WARNING
由于在mrc時(shí)代俏让,沒有weak指針楞遏,所以一些view的屬性聲明是、unsafe__unretain_的形式首昔,在arc中寡喝,這個(gè)屬性被判斷為assign,需要將其修改為weak或者strong
DIRECT_ATOMIC_PROPERTY_ACCESS
在代碼中使用了使用了一個(gè)atomic的成員變量勒奇,infer建議我們將atomic修改為nonatomic预鬓。由于OC中,屬性會(huì)被默認(rèn)設(shè)置為atomic屬性赊颠,我們需要顯示將屬性聲明為nonatomic格二。
IVAR_NOT_NULL_CHECKED
在代碼中調(diào)用block,運(yùn)行代碼時(shí)竣蹦,沒有做判空處理顶猜。即需要改動(dòng)為,if(block){block()}
BAD_POINTER_COMPARISON
沒有判斷一個(gè)NSNumber類型的對(duì)象是不是空痘括?
TAINTED_VALUE_REACHING_SENSITIVE_FUNCTION
代碼中使用了cookie的value长窄。可以理解為誤報(bào)
PARAMETER_NOT_NULL_CHECKED
傳參時(shí)沒有判斷是否為null纲菌,加一次判斷就可以了
STRONG_DELEGATE_WARNING
將一個(gè)delegate屬性設(shè)置為strong的類型挠日。
PREMATURE_NIL_TERMINATION_ARGUMENT
沒有判斷是否為空
REGISTERED_OBSERVER_BEING_DEALLOCATED
創(chuàng)建一個(gè)對(duì)象后,監(jiān)聽了某些通知翰舌,但是沒有在dealloc中釋放該通知嚣潜。項(xiàng)目中出現(xiàn)這種問題的類,基本都是單例灶芝,不會(huì)被銷毀郑原。