一.简介
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代替。
二.安装
安装方式为 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
- 打开 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 下载安装好就已经成功安装了,无需额外安装
经过长时间的解析后也可以得到些结果。这种检查方式好处是方便,直接在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文件
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