OCLint
OCLint依賴于抽象語法樹的源代碼,能檢測到編譯器沒有檢測的一些缺陷,可以很好的規(guī)避一些潛在的bug,同時也可以限定代碼規(guī)范;
OCLint靜態(tài)分析的特點:
- 效率高
- 準確率高,誤報少
- 可以動態(tài)添加檢測規(guī)則
- 靈活性、擴展性強
- 可持續(xù)集成
安裝
有多種方式可以安裝,這里建議使用Homebrew安裝:
brew tap oclint/formulae
brew install oclint
沒有安裝Homebrew的,先安裝Homebrew;使用命令安裝:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
如果安裝報錯,多試幾次就好了;
安裝和OCLint配合使用的xcpretty
gem install xcpretty
OCLint規(guī)則
OCLint是根據(jù)一系列定制的規(guī)則進行靜態(tài)分析的,OCLintz自帶了71條規(guī)則,所有規(guī)則在這里;
示例:
MissingCallToBaseMethod規(guī)則:這個規(guī)則主要檢查子類重寫父類方法時是否調用了父類的方法;
如下代碼:
@implementation CustomView
- (void)layoutSubviews {
// [super layoutSubviews]; is enforced here
}
@end
將會被檢測出,并警告提示;
默認情況下,OCLint使用了所有的71條規(guī)則,但我們可以編寫腳本配置這些規(guī)則;
-
-disable-rule 規(guī)則名命令:不使用該規(guī)則 -
-rc 規(guī)則名=新值命令:重新設置規(guī)則值
如果覺得這71條規(guī)則還不能滿足,也可以自定義規(guī)則,自己寫一套規(guī)則;
具體可以參考以下文章:
OCLint 如何自定義規(guī)則
使用
編寫腳本
# workspace的名字
WORKSPACE=AppName.xcworkspace
# scheme的名字
SCHEME=SchemeName
#編譯
xcodebuild -workspace $WORKSPACE -scheme $SCHEME clean&&
xcodebuild -workspace $WORKSPACE -scheme $SCHEME \
-configuration Debug \
COMPILER_INDEX_STORE_ENABLE=NO \
#xcpretty生成compile_commands.json
#oclint分析并生成指定格式報告(html) -report-type命令指定報告類型
#-e參數(shù)指定需要忽略的文件,即這些文件不用分析
| xcpretty -r json-compilation-database -o compile_commands.json&&
oclint-json-compilation-database -e Pods -e Vender -- \
-report-type html >> oclint_result.html \
#設置規(guī)則
-disable-rule ProblematicBaseClassDestructor \
-disable-rule DestructorOfVirtualClass \
-disable-rule AssignIvarOutsideAccessors \
-disable-rule ParameterReassignment \
-disable-rule ShortVariableName \
-disable-rule RedundantLocalVariable \
-disable-rule TooManyFields \
-disable-rule TooManyMethods \
-disable-rule UnusedLocalVariable \
-disable-rule UnusedMethodParameter \
-disable-rule HighCyclomaticComplexity \
-disable-rule HighNcssMethod \
-rc LongClass=1000 \
-rc LONG_LINE=200 \
-rc LongMethod=100 \
-rc TooManyParameters=8 \
-rc DeepNestedBlock=5 \
-max-priority-1=100000 \
-max-priority-2=100000 \
-max-priority-3=100000; \
rm compile_commands.json
(需要拷貝這段腳本的,請去掉注釋)
終端使用
cd到項目目錄下,直接拷貝上面腳本運行;
或者將腳本保存為.sh文件如oclint.sh,執(zhí)行腳本文件sh oclint.sh;
執(zhí)行成功后,會生成oclint_result.htmlhtml報告,里面記錄、統(tǒng)計了根據(jù)規(guī)則分析的問題:

Xcode集成
通過命令行的方式,雖然也可以得到分析結果,但不直觀;最直觀的方式是集成進Xcode,編譯項目后,不符合規(guī)則的地方都會有警告;
-
新建target,選擇
Aggregate,填寫名稱OCLint(隨意);
-
選擇
Build Phase,添加腳本
腳本輸入框中,填寫腳本;上面的腳本可以直接拿來用,但要稍微改下,
-report-type需要更改為xcode;

- 選擇OCLint,編譯后就能看到不合規(guī)的代碼警告了:


Jenkins持續(xù)集成
OCLint同樣也支持Jenkins持續(xù)集成,使用PWD插件顯示報告;
具體還未實踐......
期間遇到的問題
-
one compiler command contains multiple jobs
解決方法是:腳本中編譯后添加代碼COMPILER_INDEX_STORE_ENABLE=NO,同時將pod項目中build setting中COMPILER_INDEX_STORE_ENABLE設置為NO;
參考 https://github.com/oclint/oclint/issues/462
-
cannot open report output file
之前的腳本,輸出報告用的是-report-type html -o oclint_result.html,將-o改為>>即可;
參考 https://blog.csdn.net/Nathan1987_/article/details/101773435


