一、概述
在软件开发过程中,开发团队往往要花费大量的时间和精力发现并修改代码缺陷。传统的代码评审、同事复审,通过人工方式来检查缺陷仍然是一件耗时耗力的事情。而静态代码扫描工具能够在代码构建过程中帮助开发人员快速、有效的定位代码缺陷并及时纠正这些潜在的问题。
通过调研,本文将着重介绍几款常用的静态代码扫描工具,这些工具分为几类:
轻量级静态代码扫描工具:Cppcheck
、 Tscancode
插件嵌入式扫描工具:SourceInsight_Scan
、PC-lint
Linux环境下扫描工具:splint
平台扫描工具:SonarQube
二、Cppcheck
1、软件介绍
Cppcheck是C/C++代码的静态分析工具。它提供独特的代码分析来检测bug,并着重于检测未定义的行为和危险的编码结构,目标是只检测代码中的实际错误。
官方网站:http://cppcheck.net/
一些使用方法博客:https://www.oschina.net/p/cppcheck
2、检查点
1)自动变量检查
2)数组的边界检查
3)class类检查
4)过期的函数,废弃函数调用检查
5)异常内存使用,释放检查
6)内存泄漏检查,主要是通过内存引用指针
7)操作系统资源释放检查,中断,文件描述符等
8)异常STL 函数使用检查
9)代码格式错误,以及性能因素检查
3、Windows版本界面风格
4、总结
Cppcheck 这款工具安装简单,能够在Linux,windows环境上运行,Linux版本安装详见官网。工具支持单个文件检查,目录检查(不支持中文目录),使用简单,方便。
三、Tscancode
1、软件介绍
TscanCode是腾讯出品的开源静态代码扫描工具,旨在助力开发与测试人员从代码层面挖掘问题,将那些长期困扰项目的诸如空指针宕机等问题,扼杀于萌芽阶段。支持用户根据不同需求自定义配置检查项,有极强的扩展性和可维护性。平均扫描速度10W行/分钟。
官方下载地址:https://github.com/Tencent/TscanCode
详细使用博客参考:https://blog.csdn.net/liweibin812/article/details/84544750
2、检查点
1)空指针检查
2)数据越界
3)内存泄漏
4)逻辑错误
5)可疑代码检查
6)运算错误
3、windows版本界面风格
1)软件界面
支持单文件扫描,目录扫描,选定一个目录后,可以重复多次扫描。
2)扫描结果查看界面
界面简洁,可以选择查看错误类型,可以显示错误代码上下文。
3)配置规则界面
支持多种语言,多种规则的选择,使用灵活。
4、总结
TScanCode这款工具安装简单,能够在mac、Linux、windows环境上运行。工具提供友好的结果展示及误报屏蔽等功能,误报率低、问题定位准确,能够高效的发现问题。此外该工具稳定性较好,由腾讯开发团队持续维护。
四、SourceInsight_Scan
1、软件介绍
SourceInsight_Scan是一款集成在 SourceInsight 中的c/c++代码静态分析插件,集成了cppcheck,coverity,pclint等业界优秀的静态分析工具的优点。旨在帮助开发人员,在 IDE 中快速发现编译器无法发现的非语法错误,降低修复成本。无需编译,平均扫描速度高达10W行/分钟,快速发现潜在的质量风险,平均准确率高达80%。
官方网站:https://sourceforge.net/projects/siscan/
安装使用说明参考:https://blog.csdn.net/sheji105/article/details/88988619
2、检查点
1)空指针检查
2)数据越界
3)内存泄漏
4)逻辑错误
3、嵌入source insight 界面
1)嵌入source insight
嵌入效果如下,可以指定当前文件,也可以扫描目录。
4、总结
SourceInsight_Scan嵌入到SourceInsight中,能够方便快捷的发现一些非语法错误,对于使用SourceInsight编程的开发人员提供了便利。但是相对于Cppcheck, Tscancode 来讲,检查出问题能力稍弱。该工具安装简单,配置稍微繁琐,使用简单。
五、PC-lint
1、软件介绍
PCLint是GIMPELSOFTWARE公司研发的C/C++软件代码静态分析工具,可以说,PCLint是一种更加严格的编译器。其主要分为PCLint和FlexeLint,PCLint主要应用于Windows平台,以二进制可执行文件提供,而FlexeLint应用于其他平台,例如Linux,以源代码形式发布。 PCLint不但能够对程序进行全局分析,识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针连同冗余的代码,还能够有效地提出许多程序在空间利用、运行效率上的改进点。
官网:http://www.gimpel.com/html/index.htm
最新安装包:http://download.csdn.net/detail/winking324/8162819
安装配置参考:https://blog.csdn.net/feng_ma_niu/article/details/40631521
详细介绍文档参考:http://www.docin.com/p-31343126.html?docfrom=rrela
2、检查点
1) 空指针检查
2) 数组越界
3) 内存泄漏
4) 强类型检查
5) 变量值跟踪
6) 赋值顺序检查
7) 弱定义检查
8) 格式检查
9) 缩进检查
10)const变量检查
11)volatile变量检查
3、嵌入Source Insight界面
1)嵌入source insight中使用
2)扫描结果
5、总结
PC-lint功能强大,检查详细,使用时需要包含当前文件中链接的所有头文件,配置操作比较复杂,但是配置完成后会轻松一点。该软件安装复杂,可以嵌入到source insight中。
六、splint
1、软件介绍
splint是一个GNU免费授权的 Lint程序,是一个动态检查C语言程序安全弱点和编写错误的程序。Splint会进行多种常规检查,包括未使用的变量,类型不一致,使用未定义变量,无法执行的代码,忽略返回值,执行路径未返回,无限循环等错误。
官网:http://splint.org/
安装参考文档:https://blog.csdn.net/sunjiajiang/article/details/7368684
splint需安装automake-1.6支持
2、检查点
1)空指针检查
2)类型检查
3)内存管理
4)缓存边界
5)宏
6)函数接口
7)控制流
3、Linux环境下使用展示
4、总结
Splint简单易用,但扫描文件需要包含所有的头文件,所有的变量声明必须在上面。安装稍微繁琐。 splint提供了三种方式可进行检查的控制,分别是.splintrc配置文件、flags标志和格式化注释,需要一定的学习成本。
七、SonarQube
1、软件介绍
SonarQube我们可以检测出项目中重复代码, 潜在bug, 代码规范,安全性漏洞等问题。可以通过使用scanner,通过配置文件,修改项目信息,在命令行中调用scanner工具,进行扫描,并推送给sonarqube,通过SonarQube web UI展示出来。
官网下载地址:https://www.sonarqube.org/downloads/ (7.9版本支持中文语言包)
c/c++代码规则插件下载:https://github.com/SonarOpenCommunity/sonar-cxx/releases
配置免费c/c++代码规则插件参考:https://blog.csdn.net/ZYzffffff/article/details/82466660
SonarQube的安装、配置与使用:https://www.cnblogs.com/qiumingcheng/p/7253917.html
2、检查点
1)内存泄漏
2)死循环
3)逻辑流程错误
4)空指针引用
5)编码规范
6)错误处理
3、使用界面
1)启动sonarqube服务成功如下图:
2)本地web页面
3)问题界面
4、总结
SonarQube功能强大,配置比较复杂(需要jdk支持、安装中文包,安装c/c++规则插件)。目前的试用情况来看,c代码检查项目详细,规则配置较多,功能完善,但是检查似乎有点问题,详见结果展示。页面显示清晰明了,但需要一定的时间熟悉操作。