iOS使用OCLint進行CodeReview

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

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

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