OCLint
OCLint依赖于抽象语法树的源代码,能检测到编译器没有检测的一些缺陷,可以很好的规避一些潜在的bug,同时也可以限定代码规范;
OCLint静态分析的特点:
- 效率高
- 准确率高,误报少
- 可以动态添加检测规则
- 灵活性、扩展性强
- 可持续集成
安装
有多种方式可以安装,这里建议使用Homebrew安装:
brew tap oclint/formulae
brew install oclint
没有安装Homebrew的,先安装Homebrew;使用命令安装:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
如果安装报错,多试几次就好了;
安装和OCLint配合使用的xcpretty
gem install xcpretty
OCLint规则
OCLint是根据一系列定制的规则进行静态分析的,OCLintz自带了71条规则,所有规则在这里;
示例:
MissingCallToBaseMethod
规则:这个规则主要检查子类重写父类方法时是否调用了父类的方法;
如下代码:
@implementation CustomView
- (void)layoutSubviews {
// [super layoutSubviews]; is enforced here
}
@end
将会被检测出,并警告提示;
默认情况下,OCLint使用了所有的71条规则,但我们可以编写脚本配置这些规则;
-
-disable-rule 规则名
命令:不使用该规则 -
-rc 规则名=新值
命令:重新设置规则值
如果觉得这71条规则还不能满足,也可以自定义规则,自己写一套规则;
具体可以参考以下文章:
OCLint 如何自定义规则
使用
编写脚本
# workspace的名字
WORKSPACE=AppName.xcworkspace
# scheme的名字
SCHEME=SchemeName
#编译
xcodebuild -workspace $WORKSPACE -scheme $SCHEME clean&&
xcodebuild -workspace $WORKSPACE -scheme $SCHEME \
-configuration Debug \
COMPILER_INDEX_STORE_ENABLE=NO \
#xcpretty生成compile_commands.json
#oclint分析并生成指定格式报告(html) -report-type命令指定报告类型
#-e参数指定需要忽略的文件,即这些文件不用分析
| xcpretty -r json-compilation-database -o compile_commands.json&&
oclint-json-compilation-database -e Pods -e Vender -- \
-report-type html >> oclint_result.html \
#设置规则
-disable-rule ProblematicBaseClassDestructor \
-disable-rule DestructorOfVirtualClass \
-disable-rule AssignIvarOutsideAccessors \
-disable-rule ParameterReassignment \
-disable-rule ShortVariableName \
-disable-rule RedundantLocalVariable \
-disable-rule TooManyFields \
-disable-rule TooManyMethods \
-disable-rule UnusedLocalVariable \
-disable-rule UnusedMethodParameter \
-disable-rule HighCyclomaticComplexity \
-disable-rule HighNcssMethod \
-rc LongClass=1000 \
-rc LONG_LINE=200 \
-rc LongMethod=100 \
-rc TooManyParameters=8 \
-rc DeepNestedBlock=5 \
-max-priority-1=100000 \
-max-priority-2=100000 \
-max-priority-3=100000; \
rm compile_commands.json
(需要拷贝这段脚本的,请去掉注释)
终端使用
cd到项目目录下,直接拷贝上面脚本运行;
或者将脚本保存为.sh文件如oclint.sh,执行脚本文件sh oclint.sh
;
执行成功后,会生成oclint_result.html
html报告,里面记录、统计了根据规则分析的问题:
Xcode集成
通过命令行的方式,虽然也可以得到分析结果,但不直观;最直观的方式是集成进Xcode,编译项目后,不符合规则的地方都会有警告;
-
新建target,选择
Aggregate
,填写名称OCLint(随意);
-
选择
Build Phase
,添加脚本
脚本输入框中,填写脚本;上面的脚本可以直接拿来用,但要稍微改下,
-report-type
需要更改为xcode;
- 选择OCLint,编译后就能看到不合规的代码警告了:
Jenkins持续集成
OCLint同样也支持Jenkins持续集成,使用PWD插件显示报告;
具体还未实践......
期间遇到的问题
-
one compiler command contains multiple jobs
解决方法是:脚本中编译后添加代码COMPILER_INDEX_STORE_ENABLE=NO
,同时将pod项目中build setting
中COMPILER_INDEX_STORE_ENABLE设置为NO;
参考 https://github.com/oclint/oclint/issues/462
-
cannot open report output file
之前的脚本,输出报告用的是-report-type html -o oclint_result.html
,将-o改为>>即可;
参考 https://blog.csdn.net/Nathan1987_/article/details/101773435