OCLint基本使用(一)

一.简介

OCLint是基于 Clang Tooling 开发的静态分析工具,主要用来发现编译器检查不到的那些潜在的关键技术问题。主要包括语法上的基础规则、Cocoa 库相关规则、一些约定俗成的规则、各种空语句检查、是否按新语法改写的检查、命名上长变量名短变量名检查、无用的语句变量和参数的检查。

OCLint是一个通过检查C,C++或Objective-C代码来提高代码质量、降低错误率的静态代码分析工具,代码通过OCLint检测后,可以发现一些潜在的问题

  • 可能的缺陷 - 空的if / else / try / catch / finally语句
  • 未使用的代码 - 未使用的局部变量和参数
  • 复杂的代码 - 很高的圈复杂度,NPath复杂性和太高的-NCSS
  • 代码异味 - 长方法和参数列表
  • 长方法和参数列表不好的实践——倒逻辑和参数重新分配
    静态代码分析是一个来检测对于编译不可见的缺陷的关键技术。
    以上翻译自OCLint官网

NPath复杂度是一个方法中各种可能的执行路径总和 ;
NCSS有效代码行

  • OClint使用的简单逻辑

OCLint工具集有三个命令:

oclint
oclint-json-compilation-database
oclint-xcodebuild
其功能可以简单概括为:
oclint 是 OCLint 工具集最主要的指令,主要作用是规则加载、编译分析选项以及生成分析报告
oclint-json-compilation-database 的作用是在 JSON Compilation Database format 类型的编译文件 compile_commands.json 中提取必要的信息。
oclint-xcodebuild 用于将 xcodebuild 生成的 log 文件 xcodebuild.log 转换为 JSON Compilation Database format 类型

这里再对上面的解释做个进一步描述:
compile_commands.json 文件是编译完成后提取并生成的信息文件。需要了解这个文件的生成,就需要使用命令xcodebuild以及oclint-xcodebuild。
由于oclint-xcodebuild已经不再维护,一般我们使用xcpretty代替。


截屏2020-12-07 下午2.20.24.png

二.安装

安装方式为 Homebrew、下载安装包安装。 个人建议使用Homebrew方式安装,更简单方便些。

1.使用Homebrew安装

安装Homebrew - Homebrew官网

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

在安装brew的时候会有443等问题.如

curl: 7Failed to connect to raw.githubusercontent.com port 443

解决办法:发现是 github 的一些域名的 DNS 解析被污染,导致DNS 解析过程无法通过域名取得正确的IP地址。可以通过修改/etc/hosts文件可解决该问题。
打开 https://www.ipaddress.com/ 输入访问不了的域名,获得对应的IP。
使用vim /etc/hosts命令打开不能访问的机器的hosts文件

199.232.68.133 raw.githubusercontent.com

199.232.68.133是raw.githubusercontent.com所在的服务器IP

  1. 打开 https://www.ipaddress.com/ 输入访问不了的域名,获得对应的IP。

Homebrew安装完成之后,执行brew命令安装第三方依赖库-oclint/formulae

brew tap oclint/formulae

接下来就可以安装oclint,目前的最新版本应该是OCLint version 0.13.

brew install oclint

运行oclint确认环境配置正确

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

2.安装xcodebuild

xcodebuild是xcode的编译命令,xcode 下载安装好就已经成功安装了,无需额外安装

xcodebuild是Xcode里面的工具,其实包含了静态代码分析的功能,打开项目后,可以通过菜单的Product->Analyze来对代码进行扫描。
截屏2021-02-18 下午8.43.59.png

经过长时间的解析后也可以得到些结果。这种检查方式好处是方便,直接在xcode中运行,并且可以按不同的方式查看静态代码的错误,点击左侧的代码可以直接跳转至有问题的代码。

但是不足之处也是显而易见的。对于QA来说,需要定期执行静态代码检查,势必要加入到持续集成系统中,最好是可以通过命令行执行;并且我们需要的是一个分类统计的结果,逐条列出便于跳转的结果方便开发自查,但不方便QA对代码质量进行把控。

3.安装xcpretty

gem install xcpretty

需要使用OCLint对日志信息进行分析运行命令,安装xcpretty,使用xcpretty命令分析日志信息。xcpretty是用来格式化xcodebuild输出的工具,使用ruby开发。

三、使用

1.进入项目更目录

cd /Users/admin/Desktop/OClint 

查看项目基本信息

xcodebuild -list

输出为

Information about project "OClint":
    Targets:
        OClint

    Build Configurations:
        Debug
        Release

    If no build configuration is specified and -scheme is not passed then "Release" is used.

    Schemes:
        OClint

这里显示了对应项目的Schemes

2.编译项目

先clean指定项目OClint,因为集成了pod,所以使用OClint.xcworkspace;然后再Debug 编译项目了;最后通过xcpretty,使用 -r json-compilation-database 可以生成指定格式的数据。编译成功后,会在项目的文件夹下出现 compile_commands.json 文件

xcodebuild -scheme OClint -workspace OClint.xcworkspace clean && xcodebuild -scheme OClint -workspace OClint.xcworkspace -configuration Debug | xcpretty -r json-compilation-database -o compile_commands.json

每次编译之前需要 clean
这时候就会生成根目录下就会生成compile_commands.json文件,我们需要把compile_commands.json生成html报表。使用 oclint-json-compilation-database 命令对上一步生成的json数据进行分析,对项目代码进行分析,最终生成report.html文件。OCLint目前支持输出html,json,xml,pmd,Xcode格式文件。

oclint-json-compilation-database -e Pods -- -report-type html -o oclintReport.html

如果项目工程太大,整个 lint 会比较耗时,所幸 oclint 支持针对某个代码文件夹进行 lint

oclint-json-compilation-database -i 需要静态分析的文件夹或文件 -- -report-type html -o oclintReport.html  其他的参数

有时候错误信息比较多利用下面的脚本则可以将报错信息写入 log 文件,方便查看

oclint-json-compilation-database -e Pods -- -report-type html -o oclintReport.html 2>&1 | tee 1.log

此时会在根目录下生成oclintReport.html文件


截屏2020-12-07 上午10.44.05.png

OCLint的分析结果:
优先级的级别是从Priority 1, Priority 2, Priority 3 依次降低的
Total Files 总文件数
Files with Violations 违规文件数
Compiler Warnings 表示项目中的警告⚠️
Compiler Errors 表示编译错误
Location 表示警告的位置
报告中的描述其实非常清晰,一般找到代码位置,结合代码理解

3.自定义规则

一些常用规则

# --命名
# 变量名字最长字节
#-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的规则

规则加载选项
-R <目录>:指定规则加载的目录。可以是多个目录,用空格隔开,默认情况下会搜索 $(oclint 可执行文件目录)/../lib/oclint/rules。
-disable-rule <规则名> 通过规则名使某些验证规则失效。
-rc <参数>=<值> 修改某些阈值。
-i:包含进某些文件
-e:过滤掉某些文件

1)可以通过 -e 参数忽略指定的文件,比如忽略Pods文件夹:
通过 -- 的方式在指令的最后 oclint 选项
通过-o 选项,表示将报告输出到当前目录的 report.html 文件中

oclint-json-compilation-database -e Pods -- -o=report.html

2)通过-rc改变检查规则的默认值

oclint-json-compilation-database -- -rc=LONG_LINE=200 -o=report.html
oclint-json-compilation-database -e Pods -rc=LONG_LINE=200-- -o=report.html

比如有一条默认规则:long line [size|P3] Line with 137 characters exceeds limit of 100 ,这表示一个方法里的代码行数不能超过100,可以通过-rc改变默认100行的限制比如改成200行
3)通过 -disable-rule可以禁止某一规则,比如禁止LongLine长方法检查:

oclint-json-compilation-database -e Pods -rc=LONG_LINE=200-- -o=report.html

4)报表最后显示问题

oclint: error: violations exceed threshold
P1=0[0] P2=0[10] P3=29[20] 

P3=29[10]是说P1(Normal级别 Warning)发现29个,但是限制为20个,超过20个则失败。因此通过-max-priority-3=9999修改阈值

相关文档

OCLint Documentation
Using OCLint with xcodebuild
Using OCLint with Xcode
oclint-json-compilation-database
json-compilation-database

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

推荐阅读更多精彩内容