infer是Facebook 的 Infer 是一個(gè)靜態(tài)分析工具褐耳⌒菜铮可以分析 Objective-C骑脱, Java 或者 C 代碼菜枷,報(bào)告潛在的問題。
任何人都可以使用 infer 檢測(cè)應(yīng)用叁丧,可以將嚴(yán)重的 bug 扼殺在發(fā)布之前啤誊,同時(shí)防止應(yīng)用崩潰和性能低下。
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ì)被銷毀。