iOS使用OCLint作静态代码分析

初识OCLint

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

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

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

安装

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

// 安装OCLint
brew tap oclint/formulae
brew install oclint
// 安装xcpretty
gem install xcpretty
复制代码

若是未安装home brew,自行去官网按提示安装json

更新

// 之后可能须要更新
brew update
brew upgrade oclint
复制代码

使用

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

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 **的文件xcode

若是没有使用cocoapods,则去掉myworkspace=haha.xcworkspace-workspace $myworkspace-workspace $myworkspace,而后再在终端执行
另外能够本身建一个xx.sh的文件,将上面代码粘贴进去,每次在命令行进入xx.sh所在目录执行bash xx.sh就能够了bash

查看

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

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彻底不够用啊)ide

一些经常使用规则的注释
# --命名
# 变量名字最长字节
#-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

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

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 + k` 和 `com + 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](https://github.com/harddog/oclint_apply),替换掉旧的 ###### 3. 试试手动将 工程=> `Build Settings` => 搜索`COMPILER_INDEX_STORE_ENABLE` 该配置设成NO
[oclint_apply仓库地址](https://github.com/harddog/oclint_apply)
参考文章:

用OCLint给iOS代码作静态分析 [OCLint 规则与结果分析](segmentfault.com/a/119000000…)e'e'e

相关文章
相关标签/搜索