OCLint在Xcode中的使用

OCLint是一个强大的静态代码分析工具,可以用来提高代码质量,查找潜在的bug,主要针对c,c++和Objective-c的静态分析,功能非常强大。

一、安装OCLint

OCLint是一个开源的项目,你可以通过下载压缩包安装,需要设置对应的环境变量,也可以使用Homebrew进行安装。

1.通过下载安装包:

从OCLint的github项目链接中下载安装包:oclint-0.13-x86_64-darwin-16.7.0.tar.gz(这是我当前的最新版本,以后读者打开可能就是更新的版本了);
下载完毕后解压,目录结构是这样的:

1517380701542.jpg

然后获取oclint-0.13的本地路径,例如我的是 /Users/zyw/Downloads/oclint-0.13
然后打开终端,在终端里面输入命令:

  vi ~/.bash_profile 
1517380970250.jpg

回车,进入.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),环境变量即配置完毕。

2.通过Homebrew进行安装

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

安装成功会显示:Installation successful!

2.2安装xcpretty (xcpretty只是其中一种,本文只介绍这一种使用)

xcpretty是OCLint的命令执行器,安装方式:
mac终端输入:

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

终端打印 2 gem installed,即安装成功

2.3安装OCLint

终端输入:

brew tap oclint/formulae
brew install oclint

展示以下内容即为安装成功:

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

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

二、OCLint在xcode中的使用

1.建立一个工程,在新建的工程里面添加一个新的目标target,并选择Aggregate为模板.

1517382420032.jpg

2.输入名字:OCLint
1517382484835.jpg

3.创建一个script
1517382714259.jpg

4.写入自定义的规则脚本
下面输入一个最基本的脚本(该脚本没有做任何自定义的规则,OCLint本身有默认的规则,该脚本用途是让xcode和OCLint关):
使用OCLint与xcpretty

4.1如果没有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如果项目中使用了cocoapods

可以添加 -e Pods过滤
代码如下:

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

规则如下:

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

知识拓展:
这是一段结合shell的脚本语言

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

这段脚本执行会在项目的根目录生成一个xcodebuild.log和compile_commands.json文件
xcodebuild.log会记录你编译过程中的信息,如编译错误信息等;

compile_commands.json文件则是记录了自定义规则代码不匹配的信息,里面是一个个字典,字典有三个键值对,command,file,directionary

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

这段脚本是把compile_commands.json里面的内容解析然后显示的xcode上面,所以xcode上面会根据这个文件显示出警告


1517385349152.jpg

5、随便写一个方法用来测试

-(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、运行
按command+B编译成功,会看到编译警告,如图:


1517383186511.jpg
7、报错

7.1如果报这个错误:

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

在终端中输入这个脚本:

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

/Applications/Xcode.app/Contents/Developer/是我电脑的路径,换成你自己的即可

7.2如果是这个错误:
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出现出现了code sign错误
第一种方法:在xcodebuild后面加上参数 CODE_SIGN_IDENTITY就行了。
第二种方法,找到项目所在target,选择一个证书即可
7.4xcodebuild和xcpretty编译报错:

20160118104708120.png

在终端上打印编码格式

locale
1518083195554.jpg

在Edit Scheme下面添加环境变量:


555.gif

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

8、其他原因

以上的都配置过了,xcode还是会报错,例如compile_commands.json不存在,或者编译显示success了,但是xcode仍然报红不消失(这是因为xcode对脚本的支持不够全面,中间产生的某些文件没有生成)

我的解决方案:在桌面上创建一个文件夹,取名为shell,打开终端,然后cd ./user/DeskTop/shell(这个shell文件夹的路径,直接拖到终端就会生成路径),vi xcode.sh,终端会进入到vi编辑器里面;同时会在shell文件夹里面生成一个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编辑器里面
同时把cd ${SRCROOT}改为 cd /Users/zyw/Desktop/OCLint-Demo
/Users/zyw/Desktop/OCLint-Demo为我xcode工程的根目录,换成你的根目录即可
,之后保存退出(esc shift+: wq),终端运行刚才的文件

./xcode.sh

可能会报权限不够,这时候需要加上

chmod +x ./xcode.sh

然后在运行

./xcode.sh

下面就是清理xcode工程,多编译几次就OK了

三、OCLint的规则

OCLint默认有71条规则,查看OCLint规则索引
可以在xocde的脚本里面写代码过滤不想要的规则
下面可以看官方给的第一个规则,点击查看地址

1.BitwiseOperatorInConditional:条件运算符中的位运算符

意思:检查条件中的按位运算。虽然在一些罕见的情况下有意编写,但按位操作被认为太“聪明”了。智能代码不容易理解。
此规则由以下类定义:oclint-rules / rules / basic / BitwiseOperatorInConditionalRule.cpp

1517387769033.jpg

代码放入我们的工程中,command+B出现警告


1517388296727.jpg

修改为如下即可


1517388458253.jpg
2. BrokenNilCheck:破零检查

在某些情况下,Objective-C中的无效检查返回正好相反的结果。

该规则由以下类定义:oclint-rules / rules / basic / BrokenNullCheckRule.cpp

1517389587791.jpg

代码放入我们的工程中,command+B出现警告


1517389802358.jpg

修改为如下即可


1517390138341.jpg

其他的规则可以一个一个运行看看

四、如何在xcode中忽略某条规则

1、把在xcode中写的这句脚本

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

双引号里面的disable-rule便是忽略某条规则,后面写上对应规则的阀值,多条的话可以在后面拼接
如:
"-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、阀值是什么
上面的规则索引文档中

1517466318084.jpg
1517466342488.jpg

规则的下方会有该规则的阀值
(基本规则没有阀值)

最后

这些规则是有c++编写,大家想研究下可以看源码
目录如下:

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容