使用infer進(jìn)行項(xiàng)目靜態(tài)分析
項(xiàng)目不使用.xcworkspace時(shí)使用,xxx為項(xiàng)目名,下同
infer -- xcodebuild -target xxx -configuration Debug -sdk iphonesimulator 晴股,如果項(xiàng)目有使用第三方會(huì)報(bào)錯(cuò)
帶有Pods帶,需要使用帶有分析第三方的命令
infer run -- xcodebuild -workspace xxx.xcworkspace -scheme xxx -configuration Debug -sdk iphonesimulator
如果第三方文件較多,分析會(huì)較為耗時(shí)部服,可以在工程目錄下新建 .inferconfig 文件,可以過(guò)濾掉Pods文件夾下的第三方庫(kù), skip-analysis-in-path是一個(gè)數(shù)組, 想要過(guò)濾其他文件, 只需要增加路徑即可如下圖
以上命令默認(rèn)都是增量分析拗慨,可使用:xcodebuild -target xxx -configuration Debug -sdk iphonesimulator clean饲宿,保證增量到非增量轉(zhuǎn)換。
分析成功后胆描,在工程目錄下會(huì)生成build和infer-out文件夾,查看infer-out下bugs.txt或者report.json處理你的問(wèn)題吧
出現(xiàn)常見(jiàn)錯(cuò)誤類(lèi)型有:
1瘫想、NULL_DEREFERENCE:空指針的情況。
1.傳參為0的情況下昌讲。例如代碼中国夜,在調(diào)用showAlertViewA()時(shí),將tag傳參為0,infer檢測(cè)此處傳0短绸,判斷為一個(gè)NULL空指針车吹,所以爆出警告。這里可以理解為誤報(bào)醋闭,不會(huì)出現(xiàn)問(wèn)題窄驹。
2.通過(guò)malloc,calloc,realloc等函數(shù)申請(qǐng)內(nèi)存,當(dāng)內(nèi)存不足時(shí)证逻,有可能會(huì)在該函數(shù)中返回NULL乐埠,如果沒(méi)有做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層沒(méi)有掃描出內(nèi)存泄露。目前掃描出的內(nèi)存泄露問(wèn)題都是使用了malloc或者ralloc等c語(yǔ)言內(nèi)存申請(qǐng)函數(shù)银酗,在函數(shù)提前return前沒(méi)有及時(shí)free
3辆影、RESOURCE_LEAK:資源泄漏
4、ASSIGN_POINTER_WARNING:由于在mrc時(shí)代黍特,沒(méi)有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í)算凿,沒(méi)有做判空處理。即需要改動(dòng)為犁功,if(block){block()}
7氓轰、BAD_POINTER_COMPARISON:沒(méi)有判斷一個(gè)NSNumber類(lèi)型的對(duì)象是不是空?
8浸卦、TAINTED_VALUE_REACHING_SENSITIVE_FUNCTION:代碼中使用了cookie的value署鸡。可以理解為誤報(bào)
9限嫌、PARAMETER_NOT_NULL_CHECKED:傳參時(shí)沒(méi)有判斷是否為null靴庆,加一次判斷就可以了
10、STRONG_DELEGATE_WARNING:將一個(gè)delegate屬性設(shè)置為strong的類(lèi)型怒医。
11炉抒、PREMATURE_NIL_TERMINATION_ARGUMENT:沒(méi)有判斷是否為空
12、REGISTERED_OBSERVER_BEING_DEALLOCATED:創(chuàng)建一個(gè)對(duì)象后稚叹,監(jiān)聽(tīng)了某些通知焰薄,但是沒(méi)有在dealloc中釋放該通知妻柒。項(xiàng)目中出現(xiàn)這種問(wèn)題的類(lèi)橄抹,基本都是單例,不會(huì)被銷(xiāo)毀裆馒。