OCLint在Xcode中的使用

OCLint是一個(gè)強(qiáng)大的靜態(tài)代碼分析工具,可以用來(lái)提高代碼質(zhì)量,查找潛在的bug,主要針對(duì)c,c++和Objective-c的靜態(tài)分析,功能非常強(qiáng)大。

一、安裝OCLint

OCLint是一個(gè)開(kāi)源的項(xiàng)目,你可以通過(guò)下載壓縮包安裝,需要設(shè)置對(duì)應(yīng)的環(huán)境變量,也可以使用Homebrew進(jìn)行安裝。

1.通過(guò)下載安裝包:

從OCLint的github項(xiàng)目鏈接中下載安裝包:oclint-0.13-x86_64-darwin-16.7.0.tar.gz(這是我當(dāng)前的最新版本,以后讀者打開(kāi)可能就是更新的版本了);
下載完畢后解壓,目錄結(jié)構(gòu)是這樣的:

1517380701542.jpg

然后獲取oclint-0.13的本地路徑,例如我的是 /Users/zyw/Downloads/oclint-0.13
然后打開(kāi)終端,在終端里面輸入命令:

  vi ~/.bash_profile 
1517380970250.jpg

回車,進(jìn)入.bash_profile的vi編輯器里面,在末尾加上

OCLINT_HOME= /Users/zyw/Downloads/oclint-0.13
export PATH=$OCLINT_HOME/bin:$PATH

其中/Users/zyw/Downloads/oclint-0.13就是上面我提到的oclint-0.13在你電腦上的本地路徑,之后就是保存(按Esc,shift+:,wq),環(huán)境變量即配置完畢。

2.通過(guò)Homebrew進(jìn)行安裝

2.1如果電腦上未安裝Homebrew,輸入下面命令安裝:
ruby -e "$(curl --insecure -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安裝成功會(huì)顯示:Installation successful!

2.2安裝xcpretty (xcpretty只是其中一種,本文只介紹這一種使用)

xcpretty是OCLint的命令執(zhí)行器,安裝方式:
mac終端輸入:

sudo gem install -n /usr/local/bin  xcpretty,

終端打印 2 gem installed,即安裝成功

2.3安裝OCLint

終端輸入:

brew tap oclint/formulae
brew install oclint

展示以下內(nèi)容即為安裝成功:

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

至此,OCLint的安裝工作算是完成;

二、OCLint在xcode中的使用

1.建立一個(gè)工程,在新建的工程里面添加一個(gè)新的目標(biāo)target,并選擇Aggregate為模板.

1517382420032.jpg

2.輸入名字:OCLint
1517382484835.jpg

3.創(chuàng)建一個(gè)script
1517382714259.jpg

4.寫(xiě)入自定義的規(guī)則腳本
下面輸入一個(gè)最基本的腳本(該腳本沒(méi)有做任何自定義的規(guī)則,OCLint本身有默認(rèn)的規(guī)則,該腳本用途是讓xcode和OCLint關(guān)):
使用OCLint與xcpretty

4.1如果沒(méi)有cocoapods
source ~/.bash_profile
cd ${SRCROOT}
xcodebuild clean
xcodebuild | tee xcodebuild.log | xcpretty -r json-compilation-database -o compile_commands.json
oclint-json-compilation-database oclint_args -- -report-type xcode
1517382863415.jpg
4.2如果項(xiàng)目中使用了cocoapods

可以添加 -e Pods過(guò)濾
代碼如下:

source ~/.bash_profile
cd ${SRCROOT}
xcodebuild clean
xcodebuild | tee xcodebuild.log | xcpretty -r json-compilation-database -o compile_commands.json
oclint-json-compilation-database -e Pods oclints_args  -- -report-type xcode

規(guī)則如下:

source ~/.bash_profile
cd ${SRCROOT}
xcodebuild clean
xcodebuild  -workspace demo.xcworkspace -scheme demo | xcpretty -r json-compilation-database --output compile_commands.json
oclint-json-compilation-database -v \
-e Pods \
-e MGLivenessDetection \
-e MGBaseKit \
-e MGIDCard \
oclint_args -- -report-type xcode \
-disable-rule ObjCAssignIvarOutsideAccessors \
-disable-rule ShortVariableName \
-rc=MINIMUM_CASES_IN_SWITCH=3 \
-rc=CYCLOMATIC_COMPLEXITY=10 \
-rc=LONG_CLASS=700 \
-rc=LONG_LINE=200 \
-rc=NCSS_METHOD=40 \
-rc=NESTED_BLOCK_DEPTH=5 \
-rc=TOO_MANY_FIELDS=20 \
-rc=TOO_MANY_METHODS=30 \
-rc=TOO_MANY_PARAMETERS=6
exit

知識(shí)拓展:
這是一段結(jié)合shell的腳本語(yǔ)言

xcodebuild | tee xcodebuild.log | xcpretty -r json-compilation-database -o >compile_commands.json  

這段腳本執(zhí)行會(huì)在項(xiàng)目的根目錄生成一個(gè)xcodebuild.log和compile_commands.json文件
xcodebuild.log會(huì)記錄你編譯過(guò)程中的信息,如編譯錯(cuò)誤信息等;

compile_commands.json文件則是記錄了自定義規(guī)則代碼不匹配的信息,里面是一個(gè)個(gè)字典,字典有三個(gè)鍵值對(duì),command,file,directionary

oclint-json-compilation-database oclint_args -- -report-type xcode

這段腳本是把compile_commands.json里面的內(nèi)容解析然后顯示的xcode上面,所以xcode上面會(huì)根據(jù)這個(gè)文件顯示出警告


1517385349152.jpg

5、隨便寫(xiě)一個(gè)方法用來(lái)測(cè)試

-(NSString *)getValueForKey:(NSString *)key
{
    NSData *valueData = nil;
    if(valueData != nil)
    {
        NSString *value = [[NSString alloc] initWithData:valueData encoding:NSUTF8StringEncoding];
        return value;
    }
    else
    {
        return nil;
    }
}
1517382983646.jpg

6、運(yùn)行
按command+B編譯成功,會(huì)看到編譯警告,如圖:


1517383186511.jpg
7、報(bào)錯(cuò)

7.1如果報(bào)這個(gè)錯(cuò)誤:

tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance

在終端中輸入這個(gè)腳本:

sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer/

/Applications/Xcode.app/Contents/Developer/是我電腦的路徑,換成你自己的即可

7.2如果是這個(gè)錯(cuò)誤:
oclint: error: violations exceed threshold
P1=0[0] P2=1637[10] P3=53904[20]
修改腳本如下:

source ~/.bash_profile
cd ${SRCROOT}
xcodebuild clean
xcodebuild | tee xcodebuild.log | xcpretty -r json-compilation-database -o compile_commands.json
oclint-json-compilation-database -e Pods oclints_args  -- -report-type xcode -max-priority-1=9999 -max-priority-2=9999 -max-priority-3=9999

末尾加上 -max-priority-1=9999 -max-priority-2=9999 -max-priority-3=9999
7.3出現(xiàn)出現(xiàn)了code sign錯(cuò)誤
第一種方法:在xcodebuild后面加上參數(shù) CODE_SIGN_IDENTITY就行了。
第二種方法,找到項(xiàng)目所在target,選擇一個(gè)證書(shū)即可
7.4xcodebuild和xcpretty編譯報(bào)錯(cuò):

20160118104708120.png

在終端上打印編碼格式

locale
1518083195554.jpg

在Edit Scheme下面添加環(huán)境變量:


555.gif

如圖:name添加LC_ALL
Value添加zh_CN.UTF-8

8、其他原因

以上的都配置過(guò)了,xcode還是會(huì)報(bào)錯(cuò),例如compile_commands.json不存在,或者編譯顯示success了,但是xcode仍然報(bào)紅不消失(這是因?yàn)閤code對(duì)腳本的支持不夠全面,中間產(chǎn)生的某些文件沒(méi)有生成)

我的解決方案:在桌面上創(chuàng)建一個(gè)文件夾,取名為shell,打開(kāi)終端,然后cd ./user/DeskTop/shell(這個(gè)shell文件夾的路徑,直接拖到終端就會(huì)生成路徑),vi xcode.sh,終端會(huì)進(jìn)入到vi編輯器里面;同時(shí)會(huì)在shell文件夾里面生成一個(gè)xcode.sh文件,把xcode里面那段腳本

source ~/.bash_profile
cd ${SRCROOT}
xcodebuild clean
xcodebuild | tee xcodebuild.log | xcpretty -r json-compilation-database -o compile_commands.json
oclint-json-compilation-database oclint_args -- -report-type xcode

粘貼到剛才終端的vi編輯器里面
同時(shí)把cd ${SRCROOT}改為 cd /Users/zyw/Desktop/OCLint-Demo
/Users/zyw/Desktop/OCLint-Demo為我xcode工程的根目錄,換成你的根目錄即可
,之后保存退出(esc shift+: wq),終端運(yùn)行剛才的文件

./xcode.sh

可能會(huì)報(bào)權(quán)限不夠,這時(shí)候需要加上

chmod +x ./xcode.sh

然后在運(yùn)行

./xcode.sh

下面就是清理xcode工程,多編譯幾次就OK了

三、OCLint的規(guī)則

OCLint默認(rèn)有71條規(guī)則,查看OCLint規(guī)則索引
可以在xocde的腳本里面寫(xiě)代碼過(guò)濾不想要的規(guī)則
下面可以看官方給的第一個(gè)規(guī)則,點(diǎn)擊查看地址

1.BitwiseOperatorInConditional:條件運(yùn)算符中的位運(yùn)算符

意思:檢查條件中的按位運(yùn)算。雖然在一些罕見(jiàn)的情況下有意編寫(xiě),但按位操作被認(rèn)為太“聰明”了。智能代碼不容易理解。
此規(guī)則由以下類定義:oclint-rules / rules / basic / BitwiseOperatorInConditionalRule.cpp

1517387769033.jpg

代碼放入我們的工程中,command+B出現(xiàn)警告


1517388296727.jpg

修改為如下即可


1517388458253.jpg
2. BrokenNilCheck:破零檢查

在某些情況下,Objective-C中的無(wú)效檢查返回正好相反的結(jié)果。

該規(guī)則由以下類定義:oclint-rules / rules / basic / BrokenNullCheckRule.cpp

1517389587791.jpg

代碼放入我們的工程中,command+B出現(xiàn)警告


1517389802358.jpg

修改為如下即可


1517390138341.jpg

其他的規(guī)則可以一個(gè)一個(gè)運(yùn)行看看

四、如何在xcode中忽略某條規(guī)則

1、把在xcode中寫(xiě)的這句腳本

oclint-json-compilation-database oclint_args -- -report-type xcode

改為

oclint-json-compilation-database oclint_args "disable-rule=LONG_CLASS -rc LONG_VARIABLE_NAME=1200" -- -report-type xcode

雙引號(hào)里面的disable-rule便是忽略某條規(guī)則,后面寫(xiě)上對(duì)應(yīng)規(guī)則的閥值,多條的話可以在后面拼接
如:
"-disable-rule=UnusedMethodParameter -disable-rule=LongLine -disable-rule=LongMethod -disable-rule=NcssMethodCount -disable-rule=ObjCObjectSubscripting -disable-rule=LongClass -disable-rule=NcssMethodCount -disable-rule=NPathComplexity -disable-rule=NPathComplexity -rc LONG_VARIABLE_NAME=1200"

2、閥值是什么
上面的規(guī)則索引文檔中

1517466318084.jpg
1517466342488.jpg

規(guī)則的下方會(huì)有該規(guī)則的閥值
(基本規(guī)則沒(méi)有閥值)

最后

這些規(guī)則是有c++編寫(xiě),大家想研究下可以看源碼
目錄如下:

├── README.md
├── oclint-core
├── oclint-driver
├── oclint-metrics
├── oclint-reporters
├── oclint-rules
└── oclint-scripts

oclint-rules/rules/basic/里面便是c++源碼

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

相關(guān)閱讀更多精彩內(nèi)容

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