OCLint 工具的使用與規(guī)則配置

OCLint工具介紹

OCLint是一個(gè)靜態(tài)代碼掃描分析工具控淡,可用于提高代碼質(zhì)量和減少潛在的缺陷左敌,目前支持C逸雹,C++营搅,Objective-C,它可以?huà)呙璩龃a中存在的問(wèn)題梆砸,比如:

  • 可能存在的錯(cuò)誤 - 比如空的 if/ else / try / catch / finally語(yǔ)句
  • 未使用的代碼段 - 比如未使用的局部變量和參數(shù)等
  • 過(guò)于復(fù)雜的代碼 - 比如多路徑判斷等
  • 冗余的代碼 - 比如冗余的if語(yǔ)句和無(wú)用的括號(hào)等
  • 不合理的代碼 - 比如超長(zhǎng)的方法和超長(zhǎng)的參數(shù)列表
  • 錯(cuò)誤的做法 - 比如反轉(zhuǎn)邏輯转质,參數(shù)的重新分配

  • 該工具配合持續(xù)集成,自動(dòng)打包編譯帖世,可以很大程度的提高編碼的樂(lè)趣以及盡早的修復(fù)潛在的問(wèn)題以降低維護(hù)成本

安裝OCLint

OCLint是運(yùn)行于Linux和MacOX平臺(tái)上的開(kāi)源工具休蟹,可以直接下載源碼進(jìn)行編譯安裝,也可以使用作者發(fā)布的release版本進(jìn)行安裝
針對(duì)于MacOS系統(tǒng)日矫,可以直接通過(guò)Homebrew進(jìn)行安裝

1. 設(shè)置brew的第三方倉(cāng)庫(kù)

brew tap oclint/formulae

2. 安裝

brew install oclint

3. OCLint升級(jí)

brew update
brew upgrade oclint

使用OCLint

命令列表

oclint -help

1赂弓、生成格式化的編譯日志文件compile_commands.json

  • 使用 xcodebuild 對(duì)工程進(jìn)行編譯
    OCLint需要根據(jù)編譯日志里的文件信息對(duì)工程進(jìn)行掃描
    xcodebuild -list 可以顯示項(xiàng)目相關(guān)的信息



    以quidemo為例
    通過(guò)以下命令對(duì)工程進(jìn)行編譯并將編譯的日志信息輸出到 xcodebuild.log 文件中

xcodebuild -target qmuidemo -configuration Debug -scheme qmuidemo| tee xcodebuild.log
  • xcpretty 格式化編譯日志
    直接使用OCLint對(duì)日志信息進(jìn)行分析
oclint-xcodebuild xcodebuild.log

得到輸出信息為:

This binary is no longer under maintenance by OCLint team.
Please consider using xcpretty (https://github.com/supermarin/xcpretty) instead!

提示需要使用xcpretty來(lái)分析日志信息,需要安裝xcpretty, xcpretty可對(duì)xcodebuild的輸出進(jìn)行格式化哪轿。并且可以輸出多種格式的日志信息盈魁,這里需要安裝xcpretty

gem install xcpretty

注:如果沒(méi)有權(quán)限,則在前面添加sudo窃诉,如果提示文件夾操作被禁止Operation not permitted - /usr/bin/rougify杨耙,則更改$GEM_HOME的路徑到/usr/local/bin使用sudo gem install xcpretty -n /usr/local/bin來(lái)安裝
xcpretty安裝之后,使用--report json-compilation-database或者-r json-compilation-database可以生成指定格式的數(shù)據(jù)飘痛,當(dāng)前指定為json格式珊膜。
運(yùn)行命令:

xcodebuild | xcpretty -r json-compilation-database -o compile_commands.json

如果沒(méi)有設(shè)置json輸出路徑,則默認(rèn)的路徑在build/reports中敦冬,需要移動(dòng)并改名為compile_commands.json到根目錄
如果你想獲取編譯日志辅搬,又想獲取格式化后的編譯日志可以這樣:

xcodebuild [flags] | tee xcodebuild.log | xcpretty -r json-compilation-database -o compile_commands.json

2、OCLint根據(jù)json格式化后的編譯日志信息對(duì)代碼進(jìn)行掃描分析

使用oclint-json-compilation-database命令對(duì)上一步生成的json數(shù)據(jù)進(jìn)行分析
將build/reports目錄中的compile_commands.json移動(dòng)到項(xiàng)目根目錄脖旱,然后運(yùn)行命令

oclint-json-compilation-database — -report-type=html -o=report.html

對(duì)項(xiàng)目代碼進(jìn)行分析堪遂,最終生成report.html文件
OCLint目前支持輸出html,json萌庆,xml溶褪,pmd,xcode格式文件

3践险、OCLint分析腳本

上面的步驟可以寫(xiě)成腳本:

#! /bin/sh
xcodebuild clean
xcodebuild | xcpretty -r json-compilation-database
cp build/reports/compilation_db.json compile_commands.json
oclint-json-compilation-database —-report-type=html -o=report.html

4猿妈、OCLint的規(guī)則

  1. 可以通過(guò) -e 參數(shù)忽略指定的文件吹菱,比如忽略Pods文件夾:
oclint-json-compilation-database -e Pods -- -o=report.html
  1. 通過(guò)-rc改變檢查規(guī)則的默認(rèn)值,比如有一條默認(rèn)規(guī)則:long line [size|P3] Line with 137 characters exceeds limit of 100 彭则,這表示一個(gè)方法里的代碼行數(shù)不能超過(guò)100鳍刷,可以通過(guò)-rc改變默認(rèn)100行的限制比如改成200行:
oclint-json-compilation-database -- -rc=LONG_LINE=200 -o=report.html

具體可以操作哪些規(guī)則,可以去官網(wǎng)查詢(xún)

  1. 通過(guò) -disable-rule可以禁止某一規(guī)則,比如禁止LongLine長(zhǎng)方法檢查:
oclint-json-compilation-database -disable-rule=LongLine
  1. 這些命令是可以組合使用俯抖,比如:
oclint-json-compilation-database -e Pods -rc=LONG_LINE=200-- -o=report.html
  1. 如果需要更改的規(guī)則比較多输瓜,可以通過(guò).oclint 文件配置規(guī)則
    具體編寫(xiě)規(guī)則如下:



    規(guī)則默認(rèn)值:

Name Description Default
CYCLOMATIC_COMPLEXITY Cyclomatic complexity of a method 10
LONG_CLASS Number of lines for a C class or Objective-C interface, category, protocol, and implementation 1000
LONG_LINE Number of characters for one line of code 100
LONG_METHOD Number of lines for a method or function 50
LONG_VARIABLE_NAME Number of characters for a variable name 20
MAXIMUM_IF_LENGTH Number of lines for the if block that would prefer an early exists 15
MINIMUM_CASES_IN_SWITCH Count of case statements in a switch statement 3
NPATH_COMPLEXITY NPath complexity of a method 200
NCSS_METHOD Number of non-commenting source statements of a method 30
NESTED_BLOCK_DEPTH Depth of a block or compound statement 5
SHORT_VARIABLE_NAME Number of characters for a variable name 3
TOO_MANY_FIELDS Number of fields of a class 20
TOO_MANY_METHODS Number of methods of a class 30
TOO_MANY_PARAMETERS Number of parameters of a method 10

例如:

disable-rules:
- LongLine
rulePaths:
- /etc/rules
rule-configurations:
- key: CYCLOMATIC_COMPLEXITY
value: 15
- key: NPATH_COMPLEXITY
value: 300
output: oclint.html
report-type: html
enable-clang-static-analyzer: false

在Xcode里使用OCLint

OCLint是支持在Xcode中直接顯示代碼分析結(jié)果的

  1. 給工程添加一個(gè)Aggregate的target


    Aggregate

  2. 選中剛剛創(chuàng)建的Aggregate target,然后點(diǎn)Build Phases芬萍,然后點(diǎn)左上角的加號(hào)尤揣,添加一個(gè)Add Run Script

如果你使用的是xctool ,輸入這個(gè)腳本:

source~/.bash_profile
cd ${SRCROOT}
/path/to/xctool.sh -reporter json-compilation-database:compile_commands.json clean
/path/to/xctool.sh -reporter json-compilation-database:compile_commands.json build
oclint-json-compilation-database|sed's/\(.*\.\m\{1,2\}:[0-9]*:[0-9]*:\)/\1 warning:/'

如果你使用的是自帶的xcodebuild柬祠,使用這個(gè)腳本

source~/.bash_profile
cd ${SRCROOT}
xcodebuild clean
xcodebuild|xcpretty -r json-compilation-database
oclint-json-compilation-database -- -report-type xcode
  1. 選中該target北戏,點(diǎn)擊編譯
    如果提示不存在.bash_profile文件,則手動(dòng)創(chuàng)建該文件漫蛔,由于該文件是隱藏文件嗜愈,所有得先執(zhí)行命令
defaults write com.apple.finder AppleShowAllFiles TRUE

讓Finder顯示隱藏文件,然后強(qiáng)制重新啟動(dòng)Finder惩猫,然后Command+Shift+G前往文件夾芝硬,填寫(xiě)~查看,若無(wú)此文件轧房,命令行進(jìn)入次目錄創(chuàng)建一個(gè)即可:

cd ~
touch .bash_profile

恢復(fù)隱藏文件的隱藏

defaults write com.apple.finder AppleShowAllFiles FALSE

后重新啟動(dòng)Finder
4拌阴、結(jié)果


結(jié)果

控制OCLint的檢查

有的時(shí)候,我們?cè)谝阎欢未a會(huì)產(chǎn)生OCLint的警告奶镶,但是因?yàn)槟承┰虺僭撸覀儧](méi)法去修改該段代碼,或者沒(méi)有更好的修改方法厂镇,這時(shí)候纤壁,我們可以在代碼中控制OCLint忽略對(duì)這段代碼的檢查

1. 注解

可以使用注解的方法禁止OCLint的檢查,語(yǔ)法是:

__attribute__((annotate("oclint:suppress[unused method parameter]")))

比如我們知道一個(gè)參數(shù)沒(méi)有使用捺信,而又不想產(chǎn)生警告信息就可以這樣寫(xiě)酌媒,下面這段代碼可以忽略對(duì)sender的警告但是沒(méi)法忽略對(duì)參數(shù)i的警告:

- (IBAction)turnoverValueChanged: (id) __attribute__((annotate("oclint:suppress[unused method parameter]"))) sender
{
     int i;// 這個(gè)參數(shù)不會(huì)被忽略,會(huì)產(chǎn)生OCLint警告
     [self calculateTurnover];
}

對(duì)于方法的注解可以這樣寫(xiě)迄靠,下面方法中產(chǎn)生的警告都會(huì)被忽略掉:

bool __attribute__((annotate("oclint:suppress"))) aMethod(int aParameter)
{
    // 這個(gè)方法里所有的警告都會(huì)被忽略
    // 比如下面這個(gè)空的if警告會(huì)被忽略
    if (1) {}
    return true;
}
2.!OCLint

也可以通過(guò)//!OCLint注釋的方式秒咨,不讓OCLint檢查。比如掌挚,禁止對(duì)未使用的參數(shù)unusedLocalVariable進(jìn)行檢查:

void a() {
int unusedLocalVariable; //!OCLINT
}

注釋要寫(xiě)在對(duì)應(yīng)的行上面才能禁止對(duì)應(yīng)的檢查雨席,比如對(duì)于空的if/else禁止檢查的注釋為:

if (true) //!OCLint
{
// it is empty
}

END

最后編輯于
?著作權(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
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(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)容