用OCLint给iOS代码做静态分析

原文链接: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
 
 
  • 1
  • 2
  • 1
  • 2

如果安装不了请翻墙.

使用

先编译一遍工程, 然后执行脚本就可以生成报告了. 如果不存在bash_profile文件, 需要自己生成一个, 进到那个目录后touch .bash_profile.

笔者先抛砖引玉的给出一个自定义了部分扫描规则的脚本. 

# import path
export PATH=${PATH}:/usr/local/bin
# import what we have in bash_profile
source ~/.bash_profile

# oclint
workspaceExt=".xcworkspace"
tempPath=""
project_path=$(pwd)
project_name=$(ls | grep xcodeproj | awk -F.xcodeproj '{print $1}')

# 更新第三方库
if [ -f Podfile ]; then
echo "==========pod update========="
#pod update
fi

# find .xcworkspace
for workspacePath in `find ${project_path} -name "$project_name$workspaceExt" -print`
do
tempPath=${workspacePath}
break
done
echo "===========oclint=========="
if [ "$tempPath" == "" ];then
# oclint clean
xctool  -project ${project_name}.xcodeproj \
-scheme ${project_name} \
-reporter json-compilation-database:compile_commands.json \
clean
echo "===========oclint=project=clean=done========="
# build
xctool  -project ${project_name}.xcodeproj \
-scheme ${project_name} \
-reporter json-compilation-database:compile_commands.json \
build
echo "===========oclint=project=build=done========="
else
# oclint clean
xctool  -workspace ${project_name}.xcworkspace \
-scheme ${project_name} \
-reporter json-compilation-database:compile_commands.json \
clean
echo "===========oclint=workspace=clean=done========="
# build
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

# 删除 compile_commands.json 可能会很大
jsonPath=$project_path/"compile_commands.json"
#echo ${jsonPath}
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
 
 
  • 1
  • 1

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                // empty else statement, can be safely removed
    {
    }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

后记

最后就是配置下Jenkins, 让每次编译的同时, 都给出一个报告来.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值