iOS靜態(tài)分析過程

靜態(tài)分析在這里,我主要介紹兩方面,一個是正常的code review機制,另外一個就是代碼靜態(tài)檢查工具

code review

組內(nèi)的code review機制,可以參考團隊之前的OpenDoc - 前端團隊CodeReview制度,iOS客戶端開發(fā),會在此基礎(chǔ)上進行一些常見手誤及Crash情況的重點標記,比如:

1 我們開發(fā)中首先都是在測試環(huán)境開發(fā),開發(fā)時可以將測試環(huán)境的url寫死到代碼中,但是在提交代碼的時候一定要將他改為線上環(huán)境的url,這個就可以通過gitlab中的重點比較部分字符串,給提交者一個強力的提示;

2 其他常見Crash的重點檢查,比如NSMutableString/NSMutableArray/NSMutableDictionary/NSMutableSet 等類下標越界判斷保護,或者 append/insert/add nil對象的保護;

3 ARC下的release操作,UITableViewCell返回nil,以及前面介紹的常見的循環(huán)引用等。

code review機制,一方面是依賴寫代碼者的代碼習(xí)慣及質(zhì)量,另一名依賴審查者的經(jīng)驗和細心程度,即使讓多人revew,也可能會漏過一些錯誤,所以我們又添加了代碼的靜態(tài)檢查。

代碼靜態(tài)檢查

代碼靜態(tài)分析(Static Program Analysis)是指在不運行程序的條件下,由代碼靜態(tài)分析工具自動對程序進行分析的方法. iOS常見的靜態(tài)掃描工具有Clang Static Analyzer、OCLint、Infer,這些主要是用來檢查可能存在的問題,還有Deploymate用來檢查api的兼容性。

Clang Static Analyzer

Clang Static Analyzer是一款靜態(tài)代碼掃描工具,專門用于針對C,C++和Objective-C的程序進行分析。已經(jīng)被Xcode集成,可以直接使用Xcode進行靜態(tài)代碼掃描分析,Clang默認的配置主要是空指針檢測,類型轉(zhuǎn)換檢測,空判斷檢測,內(nèi)存泄漏檢測這種等問題。如果需要更多的配置,可以使用開源的Clang項目,然后集成到自己的CI上。

OCLint

OCLint是一個強大的靜態(tài)代碼分析工具,可以用來提高代碼質(zhì)量,查找潛在的bug,主要針對 C、C++和Objective-C的靜態(tài)分析。功能非常強大,而且是出自國人之手。OCLint基于 Clang 輸出的抽象語法樹對代碼進行靜態(tài)分析,支持與現(xiàn)有的CI集成,部署之后基本不需要維護,簡單方便。

OCLint可以發(fā)現(xiàn)這些問題

可能的bug - 空的 if / else / try / catch / finally 語句
未使用的代碼 - 未使用的局部變量和參數(shù)
復(fù)雜的代碼 - 高圈復(fù)雜度, NPath復(fù)雜, 高NCSS
冗余代碼 - 多余的if語句和無用的括號
壞味道的代碼 - 過長的方法和過長的參數(shù)列表
不好的使用 - 倒邏輯和入?yún)⒅匦沦x值
對于OCLint的與原理和部署方法,可以參考團隊成員之前的文章:靜態(tài)代碼分析之OCLint的那些事兒,每次提交代碼后,可以在打包的過程中進行代碼檢查,及早發(fā)現(xiàn)有問題的代碼。當然也可以在合并代碼之前執(zhí)行對應(yīng)的檢查,如果檢查不通過,不能合并代碼,這樣檢查的力度更大。

Infer

Infer facebook開源的靜態(tài)分析工具,Infer可以分析 Objective-C, Java 或者 C 代碼,報告潛在的問題。Infer效率高,規(guī)模大,幾分鐘能掃描數(shù)千行代碼;

C/OC中捕捉的bug類型主要有:

1:Resource leak
2:Memory leak
3:Null dereference
4:Premature nil termination argument
只在 OC中捕捉的bug類型

1:Retain cycle
2:Parameter not null checked
3:Ivar not null checked
結(jié)論

Clang Static Analyzer和Xcode集成度更高、更好用,支持命令行形式,并且能夠用于持續(xù)集成。OCLint有更多的檢查規(guī)則和定制,和很多工具集成,也同樣可用于持續(xù)集成。Infer效率高,規(guī)模大,幾分鐘能掃描數(shù)千行代碼;支持增量及非增量分析;分解分析,整合輸出結(jié)果。infer能將代碼分解,小范圍分析后再將結(jié)果整合在一起,兼顧分析的深度和速度,所以根據(jù)自己的項目特點,選擇合適的檢查工具對代碼進行檢查,減少人力review成本,保證代碼質(zhì)量,最大限度的避免運行錯誤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容