背景:
随之团队的扩大,统一编码规范,提高编码质量,变得尤为重要。 通常的做法就是人工CodeReview,但是这个过程耗费的工时往往较大,所以考虑让机器帮助完成一部分代码质量的检测,从而提高工作效率。
开发工具现状:
尽管苹果在XCode上已经添加了编码警告,也具有代码静态分析功能(内部集成了Clang Static Analyzer工具),但仍然存在一定问题,如无法自定义规则,分析时间长,展示结果不直观。
开源社区现状:
目前主流Objective-C静态分析工具是OCLint,具有较好的代码分析能力,另外,支持规则插件化,针对不同的需求开发规则插件,在分析中指定规则分析。
OCLint工具介绍:
OCLint是一个基于Clang编译器开发的C++静态代码分析工具,通过检查C 、C++ 和Objective-C代码和寻找潜在问题来提高代码质量和减少代码缺陷。可以完成的工作有:
1、可能的缺陷 - 空的if / else / try / catch / finally语句;
2、未使用的代码 - 未使用的局部变量和参数;
3、复杂的代码 - 高的圈复杂度,NPath复杂性和太高的NCSS;
4、冗余代码 - 多余的if语句和无用的括号;
5、坏味道的代码 - 过长的方法和过长的参数列表;
6、不好的使用 - 倒逻辑和入参重新赋值;
优点:OCLint有更多的检查规则和定制,和很多工具集成,也同样可用于持续集成。
另外一款Objective-C代码分析工具是Infer。Infer 是一个Facebook开发的静态程序分析工具,可以对 Java、C 和 Objective-C 程序进行分析,此工具是用OCaml语言写成的。可以完成的工作有:
1、资源使用检查;
2、内存泄漏;
3、空对象检查;
4、参数非空检查;
5、Ivar非空检查;
6、空终止检查;
7、循环引用检查;
优点:
1、效率高,规模大,几分钟能扫描数千行代码;
2、支持增量及非增量分析(后边会解释);
3、分解分析,整合输出结果。(infer能将代码分解,小范围分析后再将结果整合在一起,兼顾分析的深度和速度);
结论方案:
1、使用OCLint做代码分析工具,开发自定义代码规则插件,配合Sonar(代码检查CI框架)框架直观展示分析结果。成本为自定义规则插件开发上,建议前期使用此方案。
2、对OCLint和Infer做二次开发。成本为自定义插件和二次开发,建议在具有一定静态代码分析能力后,使用此方案来优化提升静态分析能力。