静态分析在这里,我主要介绍两方面,一个是正常的code review机制,另外一个就是代码静态检查工具
code review
组内的code review机制,可以参考团队之前的OpenDoc - 前端团队CodeReview制度,iOS客户端开发,会在此基础上进行一些常见手误及Crash情况的重点标记,比如:
1 我们开发中首先都是在测试环境开发,开发时可以将测试环境的url写死到代码中,但是在提交代码的时候一定要将他改为线上环境的url,这个就可以通过gitlab中的重点比较部分字符串,给提交者一个强力的提示;
2 其他常见Crash的重点检查,比如NSMutableString/NSMutableArray/NSMutableDictionary/NSMutableSet 等类下标越界判断保护,或者 append/insert/add nil对象的保护;
3 ARC下的release操作,UITableViewCell返回nil,以及前面介绍的常见的循环引用等。
code review机制,一方面是依赖写代码者的代码习惯及质量,另一名依赖审查者的经验和细心程度,即使让多人revew,也可能会漏过一些错误,所以我们又添加了代码的静态检查。
代码静态检查
代码静态分析(Static Program Analysis)是指在不运行程序的条件下,由代码静态分析工具自动对程序进行分析的方法. iOS常见的静态扫描工具有Clang Static Analyzer、OCLint、Infer,这些主要是用来检查可能存在的问题,还有Deploymate用来检查api的兼容性。
Clang Static Analyzer
Clang Static Analyzer是一款静态代码扫描工具,专门用于针对C,C++和Objective-C的程序进行分析。已经被Xcode集成,可以直接使用Xcode进行静态代码扫描分析,Clang默认的配置主要是空指针检测,类型转换检测,空判断检测,内存泄漏检测这种等问题。如果需要更多的配置,可以使用开源的Clang项目,然后集成到自己的CI上。
OCLint
OCLint是一个强大的静态代码分析工具,可以用来提高代码质量,查找潜在的bug,主要针对 C、C++和Objective-C的静态分析。功能非常强大,而且是出自国人之手。OCLint基于 Clang 输出的抽象语法树对代码进行静态分析,支持与现有的CI集成,部署之后基本不需要维护,简单方便。
OCLint可以发现这些问题
可能的bug - 空的 if / else / try / catch / finally 语句
未使用的代码 - 未使用的局部变量和参数
复杂的代码 - 高圈复杂度, NPath复杂, 高NCSS
冗余代码 - 多余的if语句和无用的括号
坏味道的代码 - 过长的方法和过长的参数列表
不好的使用 - 倒逻辑和入参重新赋值
对于OCLint的与原理和部署方法,可以参考团队成员之前的文章:静态代码分析之OCLint的那些事儿,每次提交代码后,可以在打包的过程中进行代码检查,及早发现有问题的代码。当然也可以在合并代码之前执行对应的检查,如果检查不通过,不能合并代码,这样检查的力度更大。
Infer
Infer facebook开源的静态分析工具,Infer可以分析 Objective-C, Java 或者 C 代码,报告潜在的问题。Infer效率高,规模大,几分钟能扫描数千行代码;
C/OC中捕捉的bug类型主要有:
1:Resource leak
2:Memory leak
3:Null dereference
4:Premature nil termination argument
只在 OC中捕捉的bug类型
1:Retain cycle
2:Parameter not null checked
3:Ivar not null checked
结论
Clang Static Analyzer和Xcode集成度更高、更好用,支持命令行形式,并且能够用于持续集成。OCLint有更多的检查规则和定制,和很多工具集成,也同样可用于持续集成。Infer效率高,规模大,几分钟能扫描数千行代码;支持增量及非增量分析;分解分析,整合输出结果。infer能将代码分解,小范围分析后再将结果整合在一起,兼顾分析的深度和速度,所以根据自己的项目特点,选择合适的检查工具对代码进行检查,减少人力review成本,保证代码质量,最大限度的避免运行错误。