一、OCLint官网简介
OCLint是一个代码静态分析描工具,可以用来提高质量和减少缺陷,他目前支持C,C++,Objective-C语言,它目前可以发现这些问题:
可能的bug - 空的 if / else / try / catch / finally 语句
未使用的代码 - 未使用的局部变量和参数
复杂的代码 - 高圈复杂度, NPath复杂, 高NCSS
冗余代码 - 多余的if语句和无用的括号
坏味道的代码 - 过长的方法和过长的参数列表
不好的使用 - 倒逻辑和入参重新赋值
官网地址:http://oclint.org
检查规则(71项):http://docs.oclint.org/en/stable/rules/index.html
二、OCLint相关命令参数介绍
1、OCLint
-R 添加规则加载目录
-allow-duplicated-violations 允许报告中重复报警
-disable-rule=<rule name> 禁止某项规则
-enable-clang-static-analyzer 开启clang分析器结果写入oclint报告
-enable-global-analysis 消耗大量内存分析所有关联全局context文件
-extra-arg=<string> 添加额外参数到编译命令后
-extra-arg-before=<string> 添加额外参数到编译命令前
-list-enabled-rules 罗列所有当前支持的规则
-max-priority-X=<threshold> PX级别问题最大数量,X in (1 2 3)
-o 报告输出位置
-p 构建路径
-rc=<parameter>=<value> 重写规则行为
-report-type=<name> 报告类型html
-rule=<rule name> 显式显示报告规则
2、oclint-xcodebuild
xcodebuild | tee xcodebuild.log 构建工程,保存日志
oclint-xcodebuild xcodebuild.log 生成json编译命令文件
oclint-json-compilation-database -- -o=report.html 真正执行lint输出报告
3、oclint-json-compilation-database
-i 包含正则表达式匹配的文件
-e 排除匹配文件
可+oclint所有参数
常见oclint命令参数可查看官方文档:
http://docs.oclint.org/en/stable/manual/oclint.html#global-analysis-options
三、通过xcodebuild使用oclint
1、首先下载oclint,下载地址如下:
https://github.com/oclint/oclint/releases
选择上图中的darwin包即可,下载到本地并解压,具体安装可参照官方的安装指南:http://docs.oclint.org/en/stable/intro/installation.html,有两种安装方式,建议选用第二种方式;第一种方式可能会因为shell环境的不同而出错,即在Jenkins的Execute shell 插件中所使用的shell环境可能是sh,而不是bash,所以可能会报错:
提示:bash 和 sh 区别简介:
<1> bash是 Bourne Again SHell 是linux标准的默认shell,它基于Bourne shell,吸收了C shell和Korn shell的一些特性。bash完全兼容Bourne shell,也就是说用Bourne shell的脚本不加修改可以在bash中执行。
<2> sh是Bourne shell 这个是UNIX标准的默认shell,对它评价是简洁、紧凑、 高效、有AT&T编写,属于系统管理shell。
第一种方式:
(1)在你的个人根目录下找到“.bashrc 或 .bash_profile”文件(隐藏文件),任选其一,例如,选择了 .bash_profile,假如没有.bash_profile文件,可自行创建,创建过程如下:
1> 启动终端Terminal
2> 进入当前用户的home目录
输入cd ~
3> 创建.bash_profile
输入touch .bash_profile
4> 编辑.bash_profile文件
输入open .bash_profile
在弹出的页面进行编辑
5> 保存文件,关闭.bash_profile
6> 更新刚配置的环境变量
输入source .bash_profile
(2)把路径加到环境变量中,在 .bash_profile 文件中,添加你解压后的oclint-0.10.3的文件夹路径,官方给出的参考格式如下:
OCLINT_HOME=/path/to/oclint-release
export PATH=$OCLINT_HOME/bin:$PATH
其中,“/path/to/oclint-release”对应的就是你的oclint-0.10.3的文件夹路径,此时oclint已经安装完成了;
第二种方式:把执行文件拷贝到系统目录
cp bin/oclint* /usr/local/bin/
cp -rp lib/* /usr/local/lib/
详见官方说明:
OCLint Installation
2、通过xcodebuild执行oclint命令
(1)在bash中,通过cd命令进到需要oclint的工程路径下;
提醒:建议每次在执行xcodebuild命令之前,都先执行一次clean操作;
xcodebuild clean
(2)在bash中执行:
xcodebuild | tee xcodebuild.log
备注:若工程中存在多个不同的target,按照如下格式输入:
xcodebuild -target selectedTargetName | tee xcodebuild.log
将需要执行的target名字填入到命令中。
此命令调用xcodebuild进行了编译并把相关日志信息输入到xcodebuild.log,该log文件是后续步骤的必要条件,生成在当前的工程目录中。官方解释如下:
We need to save the xcodebuild output to a log file, by convention, name it xcodebuild.log. We can use xcodebuild | tee xcodebuild.log to pipe every line of the output to xcodebuild.log file.
(3)在bash中执行
oclint-xcodebuild xcodebuild.log
此步骤是利用之前的.log文件通过oclint-xcodebuild的可执行文件生成了名为compile_commands.json的json格式文件,该文件应该包含了多组内容,其中的key分别为directory、command、file,该文件不应该为空。此文件是下一步输入的必要条件。
(4)在bash中执行
oclint-json-compilation-database
此步骤是真正执行了oclint,执行完应该在终端输出结果。
若希望输出报告到文件中,运行如下命令:
oclint-json-compilation-database – -o=report.html
四、OCLint 和 Jenkins 的结合使用
1、怎样在Jenkins中新建一个工程,并进行配置,这里就不赘述了,可参照
“Jenkins + Xcode + Fir.im 自动构建项目,并打包ipa上传(MAC)“即可;
2、在Jenkins中安装 PMD Plug-in 插件;
3、接下来分两种情况讨论
(1)如果项目中没有使用CocoaPods托管第三方库
<1> 在“增加构建步骤”中选择“Execute shell”,然后在对应的Command选项中,添加如下代码:
cd MiGuRead
xcodebuild clean
xcodebuild | tee xcodebuild.log
oclint-xcodebuild xcodebuild.log
oclint-json-compilation-database -- -report-type pmd -max-priority-3=1000 -o oclint.xml
备注:MiGuRead 是对应的项目文件夹;
<2> 在“增加构建后操作步骤”中选择“Publish PMD analysis results”,然后在对应的PMD results 中,添加如下内容:
**/oclint.xml
其中 xml 文件的名称可自己定义。
(2)如果项目中使用了CocoaPods托管第三方库,那么需要对(1)中的步骤<1> 略作调整,步骤<2> 同上,具体如下:
cd podTest
xcodebuild clean
xcodebuild -workspace podTest.xcworkspace -scheme podTest | tee xcodebuild.log
oclint-xcodebuild xcodebuild.log
oclint-json-compilation-database -- -report-type pmd -max-priority-3=1000000 -o oclint.xml
备注:podTest是对应的项目文件夹;
4、构建后,我们可以在当前项目的首页中看到类似如下的趋势图:
同时,项目首页中会新增一个选项“PMD Warnings”,提示:这个选项的出现,可能会有一定的延迟,具体延迟时间视情况而定:
点击“PMD Warnings”后,可查看 PMD Result:
上图中指出了详细的规则违反情况,例如:
Files - 违反规则的文件
Categories - 违反规则的类别
Types - 违反规则的类型
Warnings - 违反规则的警告
Details - 违反规则的详情
一般通过进去看代码来解读这些违反的规则;
补充:关于规则的官方文档如下:
Rule Index
OCLint 0.10.3 includes 71 rules.
http://docs.oclint.org/en/stable/rules/index.html
参考文章: mac下通过xcodebuild使用oclint