iOS Code Review - Objective-C代碼靜態(tài)分析

Code Review

代碼評(píng)審逆趋,代碼靜態(tài)檢查欢际,Objective-C代碼靜態(tài)檢查工具——OCLint

Github: https://github.com/bobwongs/BWCodeReview

Contents

  • Overview
  • OCLint
    • 給Xcode項(xiàng)目集成OCLint
      • 1会钝、安裝
      • 2、配置
      • 3揩抡、靜態(tài)代碼分析
    • OCLint已有規(guī)則的自定義
  • Summary
  • Next
  • Reference
  • Follow Me

Overview

  • 編寫(xiě)符合項(xiàng)目團(tuán)隊(duì)規(guī)范的代碼
  • 檢查和提高項(xiàng)目代碼質(zhì)量
  • 提高項(xiàng)目的可維護(hù)性
  • 彌補(bǔ)由Xcode原本的代碼檢查所不能檢查到的問(wèn)題代碼的不足簇爆,讓代碼保持更高質(zhì)量

OCLint

對(duì)C、C++视译、Objective-C進(jìn)行靜態(tài)代碼檢查的工具

給Xcode項(xiàng)目集成OCLint

1嬉荆、安裝

必要的工具:OCLint、xcpretty(美化xcodebuild的命令行輸出日志工具)

選擇性安裝:Homebrew(The missing package manager for macOS酷含,Mac OS的包管理器鄙早,可以便捷地安裝很多常用的工具)

資源下載地址

OCLint:https://github.com/oclint/oclint/releases汪茧,選擇最新的版本進(jìn)行下載

xcpretty:https://github.com/supermarin/xcpretty,安裝命令:gem install xcpretty限番,首先要安裝有g(shù)em

Homebrew:https://brew.sh/舱污,安裝命令:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

OCLint的安裝

Reference:http://docs.oclint.org/en/stable/intro/installation.html

1、解壓OCLint安裝包弥虐,打開(kāi)終端扩灯,切換到解壓出來(lái)的OCLint安裝包目錄

code_review_install_resource
code_review_execute_cp_command

2、執(zhí)行腳本

OCLINT_HOME=/path/to/oclint-release
export PATH=$OCLINT_HOME/bin:$PATH
cp bin/oclint* /usr/local/bin/
cp -rp lib/* /usr/local/lib/

3霜瘪、安裝結(jié)果的驗(yàn)證珠插,終端輸入oclint,輸出如下結(jié)果為安裝成功

$ oclint
oclint: Not enough positional command line arguments specified!
Must specify at least 1 positional arguments: See: oclint -help

另外颖对,也可以用Homebrew進(jìn)行安裝和更新

安裝

brew tap oclint/formulae
brew install oclint

更新

brew update
brew upgrade oclint

2丧失、配置

在項(xiàng)目根目錄下創(chuàng)建用于分析的Shell腳本文件analysis.sh
code_review_project_directory_analysis

以下為analysis.sh文件內(nèi)的腳本

# 移除原有的生成文件
xcodebuild clean | xcpretty
rm -r build
rm -r compile_commands.json

# Build和把日志寫(xiě)到目標(biāo)文件
xcodebuild | xcpretty -r json-compilation-database --output compile_commands.json

Reference

http://docs.oclint.org/en/stable/guide/xcode.html

https://gist.github.com/ryuichis/755e6297aec13c900cdf

Xcode -> Build Phases -> New Run Script Phase -> Run Script,配置生成代碼不規(guī)范相關(guān)警告的Shell腳本
code_review_run_script
oclint-json-compilation-database -- -report-type xcode

說(shuō)明:如果要在項(xiàng)目源碼中進(jìn)行代碼檢查惜互,那么在檢查的時(shí)候才開(kāi)啟上述Xcode里面配置的腳本,不需要進(jìn)行檢查琳拭,打包測(cè)試训堆,提交到Git上的時(shí)候記得把檢查腳本注釋掉,不然在Build之前都會(huì)先執(zhí)行分析腳本白嘁,看具體情況對(duì)這段代碼進(jìn)行注釋或者開(kāi)啟

3坑鱼、靜態(tài)代碼分析

在命令行切換到項(xiàng)目根目錄,運(yùn)行analysis.sh絮缅,生成build目錄和用于生成警告的compile_commands.json文件
code_review_execute_analysis_shell
code_review_execute_analysis_shell_result_file

如果項(xiàng)目中有.xcworkspace鲁沥,則在使用xcodebuild命令,沒(méi)有指定相應(yīng)的參數(shù)時(shí)是會(huì)失敗的耕魄,但是沒(méi)關(guān)系画恰,只要能確保命令行的輸出里面看到有compile的字眼就OK,因?yàn)镺CLint的原理就是從compile的源文件中去檢查的

如下圖所示吸奴,即使是Build Failed允扇,也是沒(méi)問(wèn)題的,也同樣能生成供OCLint進(jìn)行靜態(tài)代碼檢查的文件

code_review_execute_analysis_shell_workspace
對(duì)Xcode項(xiàng)目進(jìn)行Command+B操作则奥,等oclint命令對(duì)compile_commands.json文件分析完成考润,就能查看到由于編碼不規(guī)范生成的警告
code_review_analysis_result_warning

OCLint已有規(guī)則的自定義

Reference

OCLint查看幫助命令:oclint -help

OCLint代碼靜態(tài)檢查規(guī)則的查看命令:oclint rt -list-enabled-rules

OCLint configuration file:http://docs.oclint.org/en/stable/howto/rcfile.html

Project Configuration File

僅針對(duì)單個(gè)項(xiàng)目的已有規(guī)則的自定義,在項(xiàng)目根目錄下創(chuàng)建.oclint文件读处,可以使用Shell命令快速創(chuàng)建

code_review_oclint_file_location
touch .oclint # 創(chuàng)建.oclint文件

.oclint文件自定義已有規(guī)則

示例一

關(guān)閉已有的一些檢查規(guī)則

查看已有檢查規(guī)則的命令:oclint rt -list-enabled-rules

disable-rules:
  - LongLine
  - LongVariableName
  - UnusedMethodParameter
示例二

自定義已有規(guī)則的限值糊治,例如單行字?jǐn)?shù)的上限

Reference:http://docs.oclint.org/en/stable/howto/thresholds.html

disable-rules:
  - LongLine
rulePaths:
  - /etc/rules
rule-configurations:
  - key: CYCLOMATIC_COMPLEXITY
    value: 15
  - key: LONG_LINE
    value: 200
output: oclint.xml
report-type: xml
max-priority-1: 20
max-priority-2: 40
max-priority-3: 60
enable-clang-static-analyzer: false

Summary

  • 對(duì)項(xiàng)目代碼質(zhì)量進(jìn)行周期性檢查
  • 及時(shí)修改不符合規(guī)范的代碼
  • 讓項(xiàng)目問(wèn)題杜絕在代碼編寫(xiě)的層面

Next

  • 自定義OCLint的檢查規(guī)則
  • Code Review的規(guī)范
  • Objective-C編碼規(guī)范
  • Swift編碼規(guī)范

Reference

OCLint

Follow Me

Github: https://github.com/bobwongs

Sina: http://weibo.com/bobwongs

歡迎打賞!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末罚舱,一起剝皮案震驚了整個(gè)濱河市井辜,隨后出現(xiàn)的幾起案子绎谦,更是在濱河造成了極大的恐慌,老刑警劉巖抑胎,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件燥滑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡阿逃,警方通過(guò)查閱死者的電腦和手機(jī)铭拧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)恃锉,“玉大人搀菩,你說(shuō)我怎么就攤上這事∑仆校” “怎么了肪跋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)土砂。 經(jīng)常有香客問(wèn)我州既,道長(zhǎng),這世上最難降的妖魔是什么萝映? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任吴叶,我火速辦了婚禮,結(jié)果婚禮上序臂,老公的妹妹穿的比我還像新娘蚌卤。我一直安慰自己,他們只是感情好奥秆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布逊彭。 她就那樣靜靜地躺著,像睡著了一般构订。 火紅的嫁衣襯著肌膚如雪侮叮。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天鲫咽,我揣著相機(jī)與錄音签赃,去河邊找鬼。 笑死分尸,一個(gè)胖子當(dāng)著我的面吹牛锦聊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播箩绍,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼孔庭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起圆到,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤怎抛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后芽淡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體马绝,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年挣菲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了富稻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡白胀,死狀恐怖椭赋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情或杠,我是刑警寧澤哪怔,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站向抢,受9級(jí)特大地震影響认境,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挟鸠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一元暴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兄猩,春花似錦、人聲如沸鉴未。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)铜秆。三九已至淹真,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間连茧,已是汗流浹背核蘸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留啸驯,地道東北人客扎。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像罚斗,于是被迫代替她去往敵國(guó)和親徙鱼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容