iOS使用OCLint作靜態代碼分析

初識OCLint

OCLint是一個靜態代碼分析工具,提升質量和減小缺陷經過檢查C 、C++ 和Objective-C 代碼和尋找潛在的問題,如:html

  • 可能的缺陷 - 空的if / else / try / catch / finally語句
  • 未使用的代碼 - 未使用的局部變量和參數
  • 複雜的代碼 - 很高的圈複雜度,NPath複雜性和過高的NCSS
  • 代碼異味 - 長方法和參數列表
  • 長方法和參數列表很差的實踐——倒邏輯和參數從新分配
  • … 靜態代碼分析是一個來檢測對於編譯不可見的缺陷的關鍵技術。

注:* NPath 複雜度是一個方法中各類可能的執行路徑總和 ; NCSS * 有效代碼行 以上翻譯自OCLint官網git

安裝

使用第三方的軟件會比使用xcodebuild方便些 最新xctool的build方法已經棄用,不能配合OCLint使用,推薦使用xcprettygithub

// 安裝OCLint
brew tap oclint/formulae
brew install oclint
// 安裝xcpretty
gem install xcpretty
複製代碼

若是未安裝home brew,自行去官網按提示安裝json

更新

// 之後可能須要更新
brew update
brew upgrade oclint
複製代碼

使用

在終端進入項目目錄,而後替換workspace的名字和scheme的名字,將修改好的命令粘貼到終端執行,等待命令執行完畢segmentfault

myworkspace=haha.xcworkspace # 替換workspace的名字
myscheme=haha # 替換scheme的名字
xcodebuild -workspace $myworkspace -scheme $myscheme clean&&
xcodebuild -workspace $myworkspace -scheme $myscheme \
-configuration Debug \
| xcpretty -r json-compilation-database -o compile_commands.json&&
oclint-json-compilation-database -e Pods -- \
-report-type html -o oclint_result.html \
-rc LONG_LINE=200 \
-max-priority-1=100000 \
-max-priority-2=100000 \
-max-priority-3=100000; \
rm compile_commands.json;
if [ -f ./oclint_result.html ]; then echo '-----分析完畢-----'
else echo "-----分析失敗-----"; fi
複製代碼

中間可能會在Build Succeeded後面等待一段時間,這是由於OCLint在分析文件 等待命令執行完成,終端會打印出-----分析完畢-----字樣, 打開項目目錄,會看到目錄下會多出一個** oclint_result.html **的文件xcode

若是沒有使用cocoapods,則去掉myworkspace=haha.xcworkspace-workspace $myworkspace-workspace $myworkspace,而後再在終端執行
另外能夠本身建一個xx.sh的文件,將上面代碼粘貼進去,每次在命令行進入xx.sh所在目錄執行bash xx.sh就能夠了bash

查看

雙擊打開oclint_result.html文件,樣式以下 OCLint的分析結果: 優先級的級別是從Priority 1, Priority 2, Priority 3 依次下降的 Total Files 總文件數 Files with Violations 違規文件數 Compiler Warnings 表示項目中的警告⚠️ Compiler Errors 表示編譯錯誤 Location 表示警告的位置 報告中的描述其實很是清晰,通常找到代碼位置,結合代碼理解下,本身基本都能明白了 能夠直接複製路徑到Chrome打開查看,右擊查看源碼就有行號 app

Paste_Image.png

自定義規則

上面的命令中 -e Pods 表示移除Pods文件夾裏代碼的分析, 若是有繼續-e Debug.m -report-type html 表示分析後輸出的文件類型爲HTML,查看其餘支持的文件類型 -o oclint_result.html 表示輸出到oclint_result.html這個文件中() -rc LONG_LINE=200 表示每行最大字節長度爲200(默認值爲100,感受在OC中100徹底不夠用啊)ide

一些經常使用規則的註釋
# --命名
# 變量名字最長字節
#-rc=LONG_VARIABLE_NAME=20 \
# 變量名字最短字節
#-disable-rule ShortVariableName \
# --size
# 圈複雜度
#-re=CYCLOMATIC_COMPLEXITY=10 \
# 每一個類最行數
#-rc=LONG_CLASS=700 \
# 每行字節數量
#-rc=LONG_LINE=200 \
# 每一個方法行數
#-rc=LONG_METHOD=80 \
# 忽略註釋後括號後的有效代碼行數
#-rc=NCSS_METHOD=40 \
# 嵌套深度
#-rc=NESTED_BLOCK_DEPTH=5 \
# 字段數量
#-rc=TOO_MANY_FIELDS=20 \
# 方法數量
#-rc=TOO_MANY_METHODS=30 \
# 方法參數
#-rc=TOO_MANY_PARAMETERS=6
複製代碼

oclint-json-compilation-database命令手冊 oclint命令手冊 OCLint自定義規則介紹 OCLint所有規則介紹 文檔裏面有每一個規則的demo和對應的命令名字,上面沒介紹到的你們能夠去文檔查詢工具

Xcode集成OCLint

這裏有官網指導網址,十分簡單 oclint-docs.readthedocs.io/en/stable/g… 可是有點小坑:可能出現下面錯誤

in `===': invalid byte sequence in US-ASCII

此時你須要在xcode的腳本的最前面,加上:

# 指定編碼
export LANG="zh_CN.UTF-8"
export LC_COLLATE="zh_CN.UTF-8"
export LC_CTYPE="zh_CN.UTF-8"
export LC_MESSAGES="zh_CN.UTF-8"
export LC_MONETARY="zh_CN.UTF-8"
export LC_NUMERIC="zh_CN.UTF-8"
export LC_TIME="zh_CN.UTF-8"
export LC_ALL=
複製代碼

我寫了一個簡單的腳本文件oclint_xcode你們能夠本身下載,可替換的變量,已經在腳本中使用註釋標註了出來

建立一個OCLint的Aggregate,將腳本放到項目工程根目錄下,在Run Script中加入如下代碼,點擊運行便可

bash ./oclint.sh
複製代碼

Jenkins集成OCLint

######1. 建立一個PMDOclint.sh的文件, 將下述代碼拷貝到文件中,並將文件放入到jenkins的根目錄下 (例如個人就是/Users/buildWork/.jenkins/PMDOclint.sh) , 我本身使用的腳本放到了倉庫中oclint_apply,能夠去裏面下載apply_jenkins/PMDOclint.sh

######2. jenkins須要安裝PMD Plugin插件 ######3. jenkins新建一個項目,Git配置成須要代碼分析的代碼庫 ######4. 剩下的按照下圖配置,(將PMDOclint.sh放到Jenkins的主目錄,若是出現問題,涉及到的路徑,請注意檢查一下)

QQ20170628-170241.png
######5. 效果

效果圖


#### Warning❗️ (一). xcodebuild命令很差用的時候,使用`com + opt + shift + k` 和 `com + shift + k` 有80%的可能解決😂 (二). `oclint: error: one compiler command contains multiple jobs:` 解決方案: ###### 1. 若是電腦裏面安裝了兩個Xcode的話可能會報上面錯誤,刪掉其餘只剩一個 ###### xcode9之後(OCLint version 0.13, Version 9.2 beta (9C34b) 測試可用): ###### 2.1 更新到最新的`oclint`, `brew upgrade oclint` ###### 2.2 去github下載最新的[oclint.sh](https://github.com/harddog/oclint_apply),替換掉舊的 ###### 3. 試試手動將 工程=> `Build Settings` => 搜索`COMPILER_INDEX_STORE_ENABLE` 該配置設成NO
[oclint_apply倉庫地址](https://github.com/harddog/oclint_apply)
參考文章:

用OCLint給iOS代碼作靜態分析 [OCLint 規則與結果分析](segmentfault.com/a/119000000…)e'e'e

相關文章
相關標籤/搜索