iOS使用OCLint做静态代码分析

初识OCLint

OCLint是一个静态代码分析工具,提高质量和减少缺陷通过检查C 、C++ 和Objective-C 代码和寻找潜在的问题,如:

  • 可能的缺陷 - 空的if / else / try / catch / finally语句
  • 未使用的代码 - 未使用的局部变量和参数
  • 复杂的代码 - 很高的圈复杂度,NPath复杂性和太高的NCSS
  • 代码异味 - 长方法和参数列表
  • 长方法和参数列表不好的实践——倒逻辑和参数重新分配

  • 静态代码分析是一个来检测对于编译不可见的缺陷的关键技术。

注:* NPath 复杂度是一个方法中各种可能的执行路径总和 ; NCSS * 有效代码行
以上翻译自OCLint官网

安装

使用第三方的软件会比使用xcodebuild方便些
最新xctool的build方法已经弃用,不能配合OCLint使用,推荐使用xcpretty

// 安装OCLint
brew tap oclint/formulae
brew install oclint
// 安装xcpretty
gem install xcpretty

如果未安装home brew,自行去官网按提示安装

更新

// 以后可能需要更新
brew update
brew upgrade oclint

使用

在终端进入项目目录,然后替换workspace的名字和scheme的名字,将修改好的命令粘贴到终端执行,等待命令执行完毕

myworkspace=haha.xcworkspace # 替换workspace的名字
myscheme=haha # 替换scheme的名字
xcodebuild -workspace $myworkspace -scheme $myscheme clean&&
xcodebuild -workspace $myworkspace -scheme $myscheme \
-configuration Debug \
| xcpretty -r json-compilation-database -o compile_commands.json&&
oclint-json-compilation-database -e Pods -- \
-report-type html -o oclint_result.html \
-rc LONG_LINE=200 \
-max-priority-1=100000 \
-max-priority-2=100000 \
-max-priority-3=100000; \
rm compile_commands.json;
if [ -f ./oclint_result.html ]; then echo '-----分析完毕-----'
else echo "-----分析失败-----"; fi

中间可能会在Build Succeeded后面等待一段时间,这是因为OCLint在分析文件
等待命令执行完成,终端会打印出-----分析完毕-----字样,
打开项目目录,会看到目录下会多出一个** oclint_result.html **的文件

如果没有使用cocoapods,则去掉myworkspace=haha.xcworkspace-workspace $myworkspace-workspace $myworkspace,然后再在终端执行
另外可以自己建一个xx.sh的文件,将上面代码粘贴进去,每次在命令行进入xx.sh所在目录执行bash xx.sh就可以了

查看

双击打开oclint_result.html文件,样式如下
OCLint的分析结果:
优先级的级别是从Priority 1, Priority 2, Priority 3 依次降低的
Total Files 总文件数
Files with Violations 违规文件数
Compiler Warnings 表示项目中的警告⚠️
Compiler Errors 表示编译错误
Location 表示警告的位置
报告中的描述其实非常清晰,一般找到代码位置,结合代码理解下,自己基本都能明白了
可以直接复制路径到Chrome打开查看,右击查看源码就有行号

Paste_Image.png

自定义规则

上面的命令中
-e Pods 表示移除Pods文件夹里代码的分析, 如果有继续-e Debug.m
-report-type html 表示分析后输出的文件类型为HTML,查看其他支持的文件类型
-o oclint_result.html 表示输出到oclint_result.html这个文件中()
-rc LONG_LINE=200 表示每行最大字节长度为200(默认值为100,感觉在OC中100完全不够用啊)

一些常用规则的注释
# --命名
# 变量名字最长字节
#-rc=LONG_VARIABLE_NAME=20 \
# 变量名字最短字节
#-disable-rule ShortVariableName \
# --size
# 圈复杂度
#-re=CYCLOMATIC_COMPLEXITY=10 \
# 每个类最行数
#-rc=LONG_CLASS=700 \
# 每行字节数量
#-rc=LONG_LINE=200 \
# 每个方法行数
#-rc=LONG_METHOD=80 \
# 忽略注释后括号后的有效代码行数
#-rc=NCSS_METHOD=40 \
# 嵌套深度
#-rc=NESTED_BLOCK_DEPTH=5 \
# 字段数量
#-rc=TOO_MANY_FIELDS=20 \
# 方法数量
#-rc=TOO_MANY_METHODS=30 \
# 方法参数
#-rc=TOO_MANY_PARAMETERS=6

oclint-json-compilation-database命令手册
oclint命令手册
OCLint自定义规则介绍
OCLint全部规则介绍
文档里面有每个规则的demo和对应的命令名字,上面没介绍到的大家可以去文档查询

Xcode集成OCLint

这里有官网指导网址,十分简单
http://oclint-docs.readthedocs.io/en/stable/guide/xcode.html
但是有点小坑:可能出现下面错误

in `===': invalid byte sequence in US-ASCII

此时你需要在xcode的脚本的最前面,加上:

# 指定编码
export LANG="zh_CN.UTF-8"
export LC_COLLATE="zh_CN.UTF-8"
export LC_CTYPE="zh_CN.UTF-8"
export LC_MESSAGES="zh_CN.UTF-8"
export LC_MONETARY="zh_CN.UTF-8"
export LC_NUMERIC="zh_CN.UTF-8"
export LC_TIME="zh_CN.UTF-8"
export LC_ALL=

我写了一个简单的脚本文件oclint_xcode大家可以自己下载,可替换的变量,已经在脚本中使用注释标注了出来

创建一个OCLint的Aggregate,将脚本放到项目工程根目录下,在Run Script中加入以下代码,点击运行即可

bash ./oclint.sh

Jenkins集成OCLint

1. 创建一个PMDOclint.sh的文件, 将下述代码拷贝到文件中,并将文件放入到jenkins的根目录下 (例如我的就是/Users/buildWork/.jenkins/PMDOclint.sh) , 我自己使用的脚本放到了仓库中oclint_apply,可以去里面下载apply_jenkins/PMDOclint.sh
2. jenkins需要安装PMD Plugin插件
3. jenkins新建一个项目,Git配置成需要代码分析的代码库
4. 剩下的按照下图配置,(将PMDOclint.sh放到Jenkins的主目录,如果出现问题,涉及到的路径,请注意检查一下)
QQ20170628-170241.png
5. 效果
效果图


Warning❗️

(一). xcodebuild命令不好用的时候,使用com + opt + shift + kcom + shift + k 有80%的可能解决😂
(二). oclint: error: one compiler command contains multiple jobs:
解决方案:

1. 如果电脑里面安装了两个Xcode的话可能会报上面错误,删掉其他只剩一个
xcode9以后(OCLint version 0.13, Version 9.2 beta (9C34b) 测试可用):
2.1 更新到最新的oclint, brew upgrade oclint
2.2 去github下载最新的oclint.sh,替换掉旧的
3. 试试手动将 工程=> Build Settings => 搜索COMPILER_INDEX_STORE_ENABLE 该配置设成NO



oclint_apply仓库地址

参考文章:

用OCLint给iOS代码做静态分析
OCLint 规则与结果分析

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

推荐阅读更多精彩内容

  • 写在前面 刚入职的时候,博哥交代给我一个任务,让我调研一款叫SonarQube的静态代码分析工具,我当时跪在了Ce...
    雨润听潮阅读 2,186评论 0 5
  • Code Review 代码评审,代码静态检查,Objective-C代码静态检查工具——OCLint Githu...
    BobWongs阅读 3,131评论 0 4
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一种新的协议。它实...
    香橙柚子阅读 22,831评论 8 183
  • 感赏儿子学习认真努力,成绩进步明显。 晚上打游戏时间超十分钟,我又在一旁唠叨数落他,儿子又哭了,说他知道会把控自己...
    吴若阅读 113评论 0 0
  • 七月的每一天,就像发烧裹在被子里一样度过,终于见识到了挥汗如雨这个成语的威力。每一次的呼吸,都能体会到空气中的...
    奶疙儿瘩阅读 318评论 0 0