為了提高代碼質(zhì)量,減少coderewview的工作量,我最近調(diào)研了iOS代碼靜態(tài)分析工具。主要研究了Infer安裝使用工作原理以及如何結(jié)合Jenkins生成iOS代碼靜態(tài)分析報(bào)告。本文簡(jiǎn)單介紹了Jenkins和Infer的使用,主要是介紹Jenkins如何使用Infer,以及集成Infer過(guò)程中所遇到的問(wèn)題
Jenkins 概述
Jenkins是最流行的開源免費(fèi)持續(xù)集成工具,他提供了一種易于使用的持續(xù)集成系統(tǒng),使開發(fā)者從繁雜的集成(例如app打包)中解脫出來(lái),專注于更為重要的業(yè)務(wù)邏輯實(shí)現(xiàn)上。同時(shí) Jenkins 能實(shí)時(shí)監(jiān)控集成中存在的錯(cuò)誤,提供詳細(xì)的日志文件和提醒功能,還能用圖表的形式形象地展示項(xiàng)目構(gòu)建的趨勢(shì)和穩(wěn)定性。Jenkins提供了豐富的管理和配置的功能,包括系統(tǒng)配置、管理插件、查詢系統(tǒng)信息、系統(tǒng)日志、節(jié)點(diǎn)管理、Jenkins命令行窗口、信息統(tǒng)計(jì)等功能。而且,Jenkins提供了非常豐富的插件支持,這為提高軟件開發(fā)效率并保障軟件開發(fā)質(zhì)量提供很多便利。
Infer 概述
Facebook的Infer是一個(gè)由 OCaml 編寫的靜態(tài)分析工具。他并不是簡(jiǎn)單糾正一下語(yǔ)法,而是一種代碼靜態(tài)分析工具。它可以在不運(yùn)行代碼(一般開發(fā)者的調(diào)試方式都是編譯、運(yùn)行,查看結(jié)果,然后人工分析代碼)的方式下,通過(guò)詞法分析、語(yǔ)法分析、控制流、數(shù)據(jù)流分析等技術(shù)對(duì)程序代碼進(jìn)行掃描,來(lái)驗(yàn)證代碼是否存在問(wèn)題或滿足技術(shù)指標(biāo)。Infer 可以分析 Objective-C, Java 或者 C 代碼,重點(diǎn)作用于分析APP(Android/iOS)項(xiàng)目,報(bào)告潛在的問(wèn)題。Infer能將代碼分解,小范圍分析后再將結(jié)果整合在一起,兼顧分析的深度和速度,支持增量及非增量分析。
Infer原理
下面的圖描述了Infer的工作流:

Infer run的時(shí)候分兩個(gè)階段:
- 捕獲階段: Infer通過(guò)編譯工具把代碼轉(zhuǎn)譯為Infer自己的中間語(yǔ)言來(lái)做靜態(tài)分析。轉(zhuǎn)譯依賴于編譯,轉(zhuǎn)譯之后的中間文件存儲(chǔ)在infer-out 文件夾中。
- 分析階段:
在這個(gè)階段,infer-out文件夾下的中間件文件會(huì)被Infer分析,當(dāng)檢測(cè)到一個(gè)函數(shù)錯(cuò)誤的時(shí)候,會(huì)暫停對(duì)這個(gè)函數(shù)的分析,但是不會(huì)停止對(duì)其他函數(shù)的分析。當(dāng)你修復(fù)完發(fā)現(xiàn)的錯(cuò)誤的后,再次運(yùn)行Infer可以檢查bug是否被修復(fù)。 最終Infer的分析結(jié)果會(huì)保存在infer-out/report.txt文件中??捎猛ㄟ^(guò)Infer 命令轉(zhuǎn)成html格式和xml格式。 - object-c中Infer檢測(cè)的問(wèn)題類型都有哪些?
- 內(nèi)存泄露,循環(huán)引用
- 變量過(guò)早設(shè)置nil導(dǎo)致的問(wèn)題
- Parameter not null checked
- Ivar not null checked
Infer 安裝
Mac OS 系統(tǒng)通過(guò)brew安裝:
brew install infer
Infer 使用
-
針對(duì)project項(xiàng)目:
//xxxApp 是你project中App target名稱 infer -- xcodebuild -target xxxApp -configuration Debug -sdk iphonesimulator -
針對(duì)workspace工程項(xiàng)目
infer -- xcodebuild -workspace 你的workspac名稱.xcworkspace -scheme 工程中scheme名稱 -configuration Debug -sdk iphonesimulator -
可以指定分析哪些文件,即whitelist和blacklist
項(xiàng)目根目錄下創(chuàng)建一個(gè)‘.inferconfig’的文件,格式如下:
{ "infer-whitelist-path-regex":[ ], "infer-blacklist-path-regex":[ "Pods/AFNetworking", "Pods/SDWebImage" ] } -
導(dǎo)出生成html的命令,infer運(yùn)行完成之后再終端輸入如下命令:
infer-explore --html
這之后會(huì)生成infer-out/report.html文件
-
生成pmd xml文件方便Jekins 的pmd插件展示結(jié)果。
infer --pmd-xml -- xcodebuild -workspace 你的workspac名稱.xcworkspace -scheme 工程中scheme名稱 -configuration Debug -sdk iphonesimulator這個(gè)命令執(zhí)行的時(shí)候可能會(huì)出錯(cuò),要求你安裝pyhton的lxml 庫(kù),這時(shí)在終端輸入下面的命令即可安裝lxml:
STATIC_DEPS=true sudo pip install lxml
安裝lxml成功后,再次運(yùn)行生成xml命令,最終會(huì)在infer-out文件加下生成report.xml文件。
-
Infer 非增量分析命令
infer --reactive -- xcodebuild -target xxxApp -configuration Debug -sdk iphonesimulator
Jenkins集成Infer步驟
Jenkins 構(gòu)建項(xiàng)目的不是本文的重點(diǎn),這里不再敘述,主要寫一下Infer腳本配置。
Jenkins構(gòu)建Infer腳本
首先進(jìn)入項(xiàng)目的配置界面,選擇構(gòu)建欄目,點(diǎn)擊增加構(gòu)建步驟,具體如下圖:

選擇Execute shell , 輸入如下圖所示的命令:

這些命令就是分析工程內(nèi)文件,最終通過(guò)infer 生成xml文件供Jenkins PMD 分析展示分析報(bào)告。
PMD 插件設(shè)置
首先Jenkins需要安裝PMD插件,這個(gè)網(wǎng)上搜索教程安裝即可。其次在項(xiàng)目配置里面配置PMD 具體如下圖所示:

在構(gòu)建后操作欄目下面,代價(jià)增加構(gòu)建后操作,選擇Publish PMD analysis results 選項(xiàng),結(jié)果如下圖:

輸入 report.xml路徑 ,如下圖:

最后點(diǎn)擊保存。回到項(xiàng)目主頁(yè),點(diǎn)擊立即構(gòu)建。構(gòu)建完成后,最終在會(huì)有PMD Warings 菜單欄,如下圖所示:

如上圖所示PMD Thrend圖表可以看到項(xiàng)目多次構(gòu)建后代碼質(zhì)量的趨勢(shì)。這里就可以看出代碼質(zhì)量近期內(nèi)的波動(dòng)。
點(diǎn)擊PMD Warnings 可以看到本次構(gòu)建的詳細(xì)錯(cuò)誤情況,結(jié)果如下圖:

這里我可以看到總的分析結(jié)果,Detail 欄目下各個(gè)選項(xiàng)能夠看到錯(cuò)誤所在的文件,以及錯(cuò)誤類型等等。具體說(shuō)Detail下各個(gè)欄目的作用
Files 是發(fā)生錯(cuò)誤的文件列表
People是git代碼庫(kù)貢獻(xiàn)的人員
Types 檢查出的代碼錯(cuò)誤類型
Warnings是警告
Origin定位錯(cuò)誤產(chǎn)生的開發(fā)人員的提交的commit ID
Details 具體產(chǎn)生bug代碼的位置,能夠定位代碼到行。
New 展示新增bug列表
Fix 展示已修復(fù)bug問(wèn)題列表