原文链接:http://blog.csdn.net/uxyheaven/article/details/50818107
用OCLint给iOS代码做静态分析
可以对iOS代码做代码静态分析的工具有OCLint
, 这篇帖子说的就是如何使用这个工具. 转载请注明出处,晓月的博客:(http://blog.csdn.net/uxyheaven/article/details/50818107)
什么是OCLint
最好的介绍当然首选官方文档, 以下的说明摘选自官方文档:
OCLint是一个代码静态分析描工具, 可以用来提高质量和减少缺陷, 他目前支持C, C++, Objective-C语言, 他目前可以发现这些问题:
- 可能的bug - 空的 if / else / try / catch / finally 语句
- 未使用的代码 - 未使用的局部变量和参数
- 复杂的代码 - 高圈复杂度, NPath复杂, 高NCSS
- 冗余代码 - 多余的if语句和无用的括号
- 坏味道的代码 - 过长的方法和过长的参数列表
- 不好的使用 - 倒逻辑和入参重新赋值
安装
brew install xctool
brew install Caskroom/cask/oclint
如果安装不了请翻墙.
使用
先编译一遍工程, 然后执行脚本就可以生成报告了. 如果不存在bash_profile
文件, 需要自己生成一个, 进到那个目录后touch .bash_profile
.
笔者先抛砖引玉的给出一个自定义了部分扫描规则的脚本.
export PATH=${PATH}:/usr/local/bin
source ~/.bash_profile
workspaceExt=".xcworkspace"
tempPath=""
project_path=$(pwd)
project_name=$(ls | grep xcodeproj | awk -F.xcodeproj '{print $1}')
if [ -f Podfile ]; then
echo "==========pod update========="
fi
for workspacePath in `find ${project_path} -name "$project_name$workspaceExt" -print`
do
tempPath=${workspacePath}
break
done
echo "===========oclint=========="
if [ "$tempPath" == "" ];then
xctool -project ${project_name}.xcodeproj \
-scheme ${project_name} \
-reporter json-compilation-database:compile_commands.json \
clean
echo "===========oclint=project=clean=done========="
xctool -project ${project_name}.xcodeproj \
-scheme ${project_name} \
-reporter json-compilation-database:compile_commands.json \
build
echo "===========oclint=project=build=done========="
else
xctool -workspace ${project_name}.xcworkspace \
-scheme ${project_name} \
-reporter json-compilation-database:compile_commands.json \
clean
echo "===========oclint=workspace=clean=done========="
xctool -workspace ${project_name}.xcworkspace \
-scheme ${project_name} \
-reporter json-compilation-database:compile_commands.json \
build
echo "===========oclint=workspace=build=done========="
fi
oclint-json-compilation-database -v \
-e Pods \
oclint_args -- -report-type html -o oclintReport.html \
-disable-rule ObjCAssignIvarOutsideAccessors \
-rc=MINIMUM_CASES_IN_SWITCH=3 \
-rc=LONG_VARIABLE_NAME=20 \
-disable-rule ShortVariableName \
-rc=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
jsonPath=$project_path/"compile_commands.json"
rm $jsonPath
open oclintReport.html
exit
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
有些文件是不想去做静态分析的, 如一些第三方库, 我们可以这样设置它, 去忽略文件夹:
-e Pods
OCLint是有一套默认的规则的. 你可以对这些默认的扫描规则做出修改, 如忽略一些规则或者改变某些规则的阈值, 这里是笔者自定义的一些扫描规则:
# 扫描规则
# 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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
扫描报告解读
脚本最终会生成一个oclintReport.html
页面去陈述扫描结果. 介绍了总共涉及多少文件, 其中有多少文件违反了规则, 各种优先级的规则违反了多少等等.
接下来就是详细的规则违反情况了:
- File - 违反规则的文件
- Location - 违反规则的代码位置
- Rule Name - 违反的规则名称
- Rule Category - 违反的规则类别
- Priority - 违反的规则优先级
- Message - 违反的规则描述
解读这些违反的规则就是进代码去看, 一般看到代码也就知道是什么原因了. 如果看了代码还是不理解, 可以去参考下官方的文档: http://docs.oclint.org/en/stable/rules/index.html
. 文档对每个规则还列出了demo.如
- empty else block // 空else
int example(int a)
{
if (1)
{
return a + 1;
}
else
{
}
}
后记
最后就是配置下Jenkins, 让每次编译的同时, 都给出一个报告来.