针对业内大量扫描工具在实际项目中扫描结果的影响比较,我们将代码质量问题分为以下几大类:
① 致命类:可能导致程序宕机、无响应等影响范围极大的错误;
② 逻辑类:可能造成程序不能达到预期逻辑结果的错误;
③ 编码规范及其他类:可能造成程序的可读性、可维护性较差的错误(不可达代码,无效的变量声明等);
1.Clang Static Analyzer:
优点:Clang Static Analyzer和xcode集成度更高、更好用,支持命令行形式,并且能够用于持续集成。
缺点:检测器比较少,只有16条。大部分是核心向的比如空指针检测,类型转换检测,空判断检测,内存泄漏检测这种一出问题必须崩的blocker级错误,和代码风格相关的几乎没有,可配置性也比较差。
针对语言:针对C,C++和Objective-C
Clang Static Analyzer发现问题:
1.内存泄露
2.代码形式,名称是否违规
3.警告容易出错的代码
4.警告程序运行时可能出现问题的代码
5.比如容易引起内存泄漏的代码,会被其检测出,提示你修正
6.代码形式,名称是否违规
7.警告容易出错的代码
8.警告程序运行时可能出现问题的代码
9.死锁等
2.OCLint
优点:有更多的检查规则和定制,可以和很多工具集成,接入CI难度低。
缺点: 使用复杂,检测速度慢,准确率低。
针对语言:针对C,C++和Objective-C
OCLint可以发现这些问题:
可能的bug - 空的 if / else / try / catch / finally 语句
未使用的代码 - 未使用的局部变量和参数
复杂的代码 - 高圈复杂度, NPath复杂, 高NCSS
冗余代码 - 多余的if语句和无用的括号
坏味道的代码 - 过长的方法和过长的参数列表
不好的使用 - 倒逻辑和入参重新赋值
3.infer
优点:效率高,规模大,几分钟能扫描数千行代码;支持增量及非增量分析
整合输出结果,准确率高。
缺点: 定制化程度低,不容易修改规则,接入CI难度高。
针对语言:针对C,Java和Objective-C
Infer捕捉的bug类型
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
总结:
最后:
如果想学习infer工具的使用可以看看我的这篇文章infer代码扫描工具详解
如果想学习OCLint工具的使用,可以看看我的这篇文章OCLint代码扫描工具详解
资料:
https://www.jianshu.com/p/b81a9f5bcf34
https://infer.liaohuqiu.net/docs/advanced-features.html
http://clang-analyzer.llvm.org/index.html
https://oclint-docs.readthedocs.io/en/stable/index.html
https://fbinfer.com/docs/getting-started.html