Xcode執(zhí)行靜態(tài)代碼分析
在項目的開發(fā)之中,每個開發(fā)者最激動最高興看到的是自己編寫的代碼,不用太多的調(diào)試就可以暢通無阻的運行,無任何bug侵襲。但這只是個理想的狀態(tài),看起 來運行良好的代碼往往都會存在潛在位置的bug,這是每位開發(fā)者最頭痛的事,也是每位開發(fā)者都想極力避免的事情。所以如果手頭用到的IDE能夠比較給力的 話,那么我們就可以避免程序中許多的bug。Xcode作為一款強大的Objective-C的IDE,其內(nèi)置提供了很多開發(fā)工具來輔助開發(fā)者的日常開發(fā) 工作,最大限度的降低開發(fā)難度,本篇簡單介紹下Xcode中的靜態(tài)代碼分析功能。
靜態(tài)分析的主要目的:
代碼中的bug往往是由于開發(fā)者忽略一些代碼缺陷而造成的,這些代碼缺陷可能是極其微小的錯誤,以至于在程序的編譯期并未給出很好的錯誤, 從而導(dǎo)致這些代碼缺陷在程序的運行期以某種非正常形式呈現(xiàn)出來。那么對于開發(fā)這開說,這些微小的代碼缺陷,往往是很難跟蹤調(diào)試的,因此也為修復(fù)代碼帶來了 很大困難。Xcode靜態(tài)代碼分析的作用即發(fā)現(xiàn)項目源代碼中的某些代碼缺陷,并分類進行提示,以方便開發(fā)者及時關(guān)注并加以修改,從而把代碼缺陷(潛在的 bug)及時清除。
靜態(tài)分析錯誤提示分類:
Xocde的靜態(tài)代碼分析工具會接卸項目的源代碼,并以以下集中錯誤類型加以標(biāo)識:
- 邏輯缺陷,例如訪問未初始化的變量或空指針的解引用
- 內(nèi)存管理缺陷,如內(nèi)存泄露
- 無用存儲缺陷(永不會被訪問的變量)
- 因未遵從項目用到的框架(frameworks)或類庫(libraries)所規(guī)范而導(dǎo)致的API使用缺陷
第一次在項目中執(zhí)行靜態(tài)分析時,可能會發(fā)現(xiàn)許多錯誤。但經(jīng)常性的執(zhí)行靜態(tài)分析并修復(fù)發(fā)現(xiàn)的代碼缺陷,之后的遇到的錯誤會越來越少。這對于編寫強壯的代碼是很有幫助的。
但要注意的是,靜態(tài)分析未報告錯誤,并不意味者程序沒有錯誤。靜態(tài)分析工具并不是萬能的,不會檢測到源代碼中的所有錯誤。
靜態(tài)代碼分析的使用舉例:
以新建StaticCodeAnalysisDemo功能為例。新建MJIssueViewController測試文件,并編寫兩個會提示靜態(tài)分析錯誤的測試方法,代碼如下:
- // Dead store
- - (void)issueCodeBlockA
- {
- CGRect frame = CGRectMake(0.0, 0.0, 100, 100);
- }
- // Memory , Potential leak of an object
- - (CGGradientRef)issueCodeBlockB
- {
- CGGradientRef gradient ;
- CGColorSpaceRef colorSapce = CGColorSpaceCreateDeviceRGB() ;
- CGFloat components[16] = {
- 211/255.0 , 101/255.0 , 98/255.0 , 1.0 ,
- 215/255.0 , 54/255.0 , 45/255.0 , 1.0 ,
- 193/255.0 , 19/255.0 , 0 , 1.0
- } ;
- CGFloat locations[] = {0.0 , 0.5 , 1.0 } ;
- int locationNum = 3 ;
- gradient = CGGradientCreateWithColorComponents(colorSapce, components, locations, locationNum);
- return gradient ;
- }
長按Xcode左上角的Run按鈕中,在彈出的下拉列表選擇Analyze,之后工程會進行自動進行build,
在成功后,在左側(cè)欄的Issue Navigation一欄中,我們可以看到Xcode靜態(tài)分析工具為我們展示的一些錯誤提示。如下圖:
此處包含了Dead Store和Memory錯誤提示,Dead Store提示了在方法中不會被使用的變量frame ;Memory提示了潛在內(nèi)存泄露錯誤(gradient變量未調(diào)用CGGradientRelease函數(shù)進行釋放)。
接著,點擊左側(cè)錯誤導(dǎo)航中的提示之一,我們看到Xcode以一種圖形化的導(dǎo)向方式為我們指定錯誤發(fā)生的流轉(zhuǎn)方式,第一次看覺得還是比較炫的。
這樣,按照靜態(tài)分析工具的錯誤提示指引,我們可以預(yù)先發(fā)現(xiàn)那些代碼缺陷,及時進行修復(fù),這樣代碼發(fā)生錯誤的概率將明顯減少。
設(shè)置工程自動進行靜態(tài)分析
選中工程文件,在TARGETS的Build Settings選項中的搜索欄中搜索關(guān)鍵字,Run Static Analyzer,在結(jié)果中,Build Options下會顯示Run Static Analyzer選項設(shè)置,雙擊該選項并在彈出窗口中將NO改為YES,
那么在下次工程直接運行時會自動進行代碼靜態(tài)分析,并給出錯誤提示。
注:描述于IOS5.1下