用OCLint给iOS代码做静态分析

来源:互联网 发布:mac睡眠时间 编辑:程序博客网 时间:2024/05/16 09:39

原文链接: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 xctoolbrew install Caskroom/cask/oclint
  • 1
  • 2
  • 1
  • 2

如果安装不了请翻墙.

使用

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

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

# import pathexport PATH=${PATH}:/usr/local/bin# import what we have in bash_profilesource ~/.bash_profile# oclintworkspaceExt=".xcworkspace"tempPath=""project_path=$(pwd)project_name=$(ls | grep xcodeproj | awk -F.xcodeproj '{print $1}')# 更新第三方库if [ -f Podfile ]; thenecho "==========pod update========="#pod updatefi# find .xcworkspacefor workspacePath in `find ${project_path} -name "$project_name$workspaceExt" -print`dotempPath=${workspacePath}breakdoneecho "===========oclint=========="if [ "$tempPath" == "" ];then# oclint cleanxctool  -project ${project_name}.xcodeproj \-scheme ${project_name} \-reporter json-compilation-database:compile_commands.json \cleanecho "===========oclint=project=clean=done========="# buildxctool  -project ${project_name}.xcodeproj \-scheme ${project_name} \-reporter json-compilation-database:compile_commands.json \buildecho "===========oclint=project=build=done========="else# oclint cleanxctool  -workspace ${project_name}.xcworkspace \-scheme ${project_name} \-reporter json-compilation-database:compile_commands.json \cleanecho "===========oclint=workspace=clean=done========="# buildxctool  -workspace ${project_name}.xcworkspace \-scheme ${project_name} \-reporter json-compilation-database:compile_commands.json \buildecho "===========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 $jsonPathopen oclintReport.htmlexit
  • 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, 让每次编译的同时, 都给出一个报告来.


0 0
原创粉丝点击