注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

C/C++静态代码检查工具对比分析  

来自zhengyinyan21   2016-12-14 19:56:33|  分类: 测试工具 |举报 |字号 订阅

  下载LOFTER 我的照片书  |

最近接触了智能医疗项目的固件端(C/C++)的测试工作,由于着手测试这个项目的时间较晚,前期的时间大多花在了固件功能测试上,保证固件功能稳定可交付给app端做调试的前提下,开始依样画瓢尝试按照之前网易青果的测试思维建立起一套固件端测试的持续集成图。先从最基本的保障代码质量的静态代码做起。下面进行了一些C/C++静态代码检查工具的调研:

1、  PC-Lint

PC-Lint是一款针对C/C++语言、windows平台的静态分析工具,FlexeLint是其他平台的,但是PC-Lint/ FlexeLint只有商业版,不便于大家对其进行学习和使用。主要功能包括:

  • 强类型检查:解决自定义类型的匹配问题
  • 初始化跟踪:对没有初始化的变量进行警告
  • 赋值跟踪:对自动的变量的值进行跟踪,在变量错误使用时进行报警
  • 参数检查:对函数的参数进行非空性检查
  • 求值顺序:对于语法上的歧义性进行警告
  •  格式检查:对printfscanf中的格式字符串进行检查
  • 代码缩进检查
  • constvolatile变量检查

2、  Splint

对于在Linux下开发程序而言,Splint具有PC-lint的大部分功能,但是Splint只支持C语言,不支持C++Splint主要应用在分析代码是否符合编程规范。Splint会进行多种常规检查,包括未使用的变量,类型不一致,使用未定义变量,无法执行的代码,忽略返回值,执行路径未返回,无限循环等错误。这个好像没人维护了,最新的是Splint 3.1.2 --- 03 May 2009。主要检查点:

  • 空指针错误:程序使用了未赋值的指针
  • 未初始化数据
  • 类型错误:检查变量类型匹配问题
  •  内存检查:内存泄露,引用计数器
  • 函数接口检测,参数传递,全局变量处理
  • 缓冲区边界检测:缓存越界,数组越界
  • 库和头文件检测

3、  Cppcheck

 cppcheck 是一个静态代码检查工具,支持c, c++代码;作为编译器的一种补充检查,cppcheck对产品的源代码执行严格的逻辑检查。 执行的检查包括:

  • 自动变量检查
  • 数组的边界检查
  • class类检查
  • 过期的函数,废弃函数调用检查
  • 异常内存使用,释放检查
  • 内存泄漏检查,主要是通过内存引用指针
  • 操作系统资源释放检查,中断,文件描述符等
  • 异常STL 函数使用检查
  • 代码格式错误,以及性能因素检查
 

以上3款工具是最常见的几款C/C++静态代码检查工具,由于pclint属于商业付费版,非开源,不考虑使用。我用cppchecksplint做了一个简单的测试,测试代码如下:

 C/C++静态代码检查工具对比分析 - 网易杭州QA - 网易杭州 QA Team

 一段c测试代码
C/C++静态代码检查工具对比分析 - 网易杭州QA - 网易杭州 QA Team
2 cppcheck检测结果

C/C++静态代码检查工具对比分析 - 网易杭州QA - 网易杭州 QA Team

3 splint检测结果

不难看出,cppcheck没有去检查if(i=5)这个if判断语句,而splint检查出这个错误。但是cppcheck有个优点,他可以与jenkins结合,检测结果以图形化界面显示在jenkins上,利于测试人员检查并跟踪代码质量情况,快速定位有问题的代码,如图2便是cppcheck的检测结果在jenkins上的展示。

 

不管cppchecksplint等静态程序分析工具的功能多么强大,它们对程序的检查也有疏漏的地方,工具的使用并不能提高我们的编程能力,我们更应该通过它们学习各种编码错误和代码隐患,凭积累的编码知识把程序隐患扼杀在摇篮里。

  评论这张
 
阅读(218)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017