OCLint静态代码分析

未来已来2018-09-12 12:31

作者:马军


code review是每个产品开发中都会遇到的环节。为了保证质量,code review需要周期性的进行,随着项目逐渐变大,这些重复的工作会占有很大一部分时间,特别是项目初期时间比较紧,为了节省时间和人力这部分工作可以交给计算机利用现有的检查工具来完成。

利用像COLint之类的工具进行code review更多的是对代码进行静态分析,通过扫描代码并比对规则,输出需要的结果。这个结果可以显示在xcode的警告,也可以通过CI输出一个代码质量的报告,供开发和QA参考。

xcode自带的静态分析工具也可以进静态行代码检查,如

但如果需要自定义规则,则可以利用OCLint工。在提交到git之前,可以先用工具在本地review一下。

大概的流程如下

sequenceDiagram
Xcode->>OCLint: oclint-xcodebuild
OCLint->>Xcode: Invoke Rules

在进行代码检查之前我们需要按先安装OCLint,安装可以参考ks论坛同事写的资料。OCLint是一个开源的,基于Clang用C++编写的静态代码分析器。它可以在代码扫描过程中动态加载规则,可以集成在xcode使用,也可以和CI集成使用。进行代码检查之前需要先配置规则,OCLint的规则被打包成dylib进行加载,放在在rules目录下,也可以开发自己的规则,OCLint已经内置了不少Rules,使用比较方便。

准备

在使用OCLint检查之前需要先生成compile_commands.json文件

compile_commands.json是Clang定义的规范,里面存放目录,命令,和需要执行的文件,结构如下

最后生成的json的文件结构如下

生成compile_commands.json文件可以直接使用oclint-xcodebuild来生成,也可以使用xcpretty。这里使用xcpretty来生成,贴一个例子,先生成xcodebuild log然后再生成所需要的json文件

xcodebuild -workspace "xxx.xcworkspace" -scheme "xxx" | xcpretty -r json-compilation-database --output compile_commands.json

配置xcode

设置一个target模板,这里命名OCLint

在build phase选项里面添加一个运行脚本

贴一下所用的脚本

source ~/.bash_profile  
cd ${SRCROOT}  
xcodebuild clean  
xcodebuild | tee xcodebuild.log  
oclint-xcodebuild  
oclint-json-compilation-database \  
-e Vendor \
-e Pods \
-report-type xcode \

这里-e 去掉pod的检查

常见的规则

# 扫描规则(oclint内置了71条规则)
# http://docs.oclint.org/en/stable/rules/index.html
# -- 
# 忽略 if折叠
#-disable-rule CollapsibleIfStatements \
# 忽略 直接使用变量
#-disable-rule ObjCAssignIvarOutsideAccessors \
# switch case 最少数量
#-rc=MINIMUM_CASES_IN_SWITCH=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

执行CMD+B查看运行结果

解读这些违反的规则就是进代码去看, 一般看到代码也就知道是什么原因了. 如果看了代码还是不理解, 可以去参考下官方的文档: http://docs.oclint.org/en/stable/rules/index.html. 文档对每个规则还列出了demo

// empty else block // 空else
int example(int a)
{
    if (1)
    {
        return a + 1;
    }
    else                // empty else statement, can be safely removed
    {
    }
}

这是在xcode里显示的检查结果,如果有jenkins平台,也配置下让其生成一个质量报告

参考资料

http://docs.oclint.org/en/stable/guide/xcode.html

本文来自网易实践者社区,经作者马军授权发布