《51测试天地》—腾讯WeTest教你玩转手游测试
 
   
C++代码质量扫描主流工具深度比较
 
  首页 上一页 2 尾页
 

  四、同类规则效果对比分析
  本文针对每个工具在关键报错项,如:空指针、越界、变量未初始化、内存泄露、逻辑上的报错结果进行分析。
  样本代码--3款游戏项目(约500万行代码)代码
  测试对象--tscancode2.0、coverity7.5、cppcheck1.68、pclint9.0、clang3.4
  有效报错数--某类规则在3款游戏项目的有效报错数总和
  准确率--某类规则在3款游戏项目的平均准确率,准确率=有效报错数/报错总数*100%
  综合评分--综合有效报错数和准确率的评分,有效报错数和准确率的权值暂定为45:55,综合评分=有效报错/最大有效报错数*100*45%+准确率*100*55%
  4.1空指针规则
  空指针检查规则主要检查是否存在对赋值为空的指针解引用的情况,空指针是c/c++中最大的问题,经常造成程序崩溃的致命错误。因此,C++静态代码分析工具对空指针的检查能力显得尤为重要。
  图为五个工具对样本代码扫描结果:
   
   
  从报错数量和准确率来看:
  有效报错数:TSC [401] >coverity[219]>>clang[57] >cppcheck[20]>pclint[14]
  准确率:coverity[95%]≈TSC[92%] ≈clang[90%]>>cppcheck[28%]>pclint[14%]
  综合评分:TSC[96分] >coverity[77分] >clang[56分]>cppcheck[18分]>pclint[8分]
  1、从准确率来看,在空指针检查方面,不考虑扫描效率和扫描环境搭建复杂度,TSC、coverity和clang都很优秀,三者准确率都很高。cppcheck, pclint在结果准确率上和数量上都较差,不推荐使用。
  2、从空指针规则细分程度来看,TSC和coverity相当,细分场景挖掘更多,cppcheck规则并未细分空指针规则,从实际项目结果来看,只能检查出dereferenceBeforeCheck场景的错误。Clang和pclint在空指针细分上维度跟TSC和coverity不同,比如:它们区分是参数指针解引用还是局部变量解引用,细分粒度不够且覆盖场景较少,其覆盖场景基本都被TSC和coverity包含。
   
  cppcheck扫描出来的问题存在大量误报,误报主要是冗余的判空,并不会引起实际问题,具体误报场景如下:
   
  3、从有效报错数量上,TSC有效报错数量更多,细分场景挖掘更多,无疑是扫描空指针最佳选择;clang覆盖的场景较少,其有效报错基本都能被coverity和TSC覆盖,不过由于其准确率较高且免费,与TSC搭配使用也是不错的选择;而coverity虽然覆盖场景多但因为只会报完全可信的问题,因此会漏掉部分有效报错,例如:指针变量来源于函数返回值,而函数返回值是否为NULL依赖于用户输入,在静态分析中coverity无法判断其是否会为NULL,为保证准确率会漏掉该指针报错。若项目对空指针漏报容忍度较高,且有足够预算采购商业软件,可以选择coverity;而cppcheck和pclint检查出的有效问题极少并伴随大量误报,同上结论,不宜使用。
  4、在易用性上,coverity和clang编译环境构建复杂,编译时长增加较多;TSC在易用性上也有一个缺点,即为提高准确率,在个别项目存在一次性配置工作。原因是个别项目存在自定义判空宏,但由于不依赖编译,TSC扫描的代码可能并不完整,导致个别自定义判空宏找不到,需要在cfg.ini中配置自定义判空宏。当然,如果扫描的代码完整度同编译环境,则无此问题。
  4.2越界规则
  越界一般来讲是指数组下标越界,或者缓冲区读写越界。这类错误会导致非法内存的访问,引发程序崩溃或者错误。
......
  本文收录于《测试专刊-腾讯WeTest教你玩转手游测试》。
  版权声明:本文出自《测试专刊-腾讯WeTest教你玩转手游测试》。51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。

 
2  
 

 

51Testing软件测试网 | 快捷面板 | 站点地图 | 联系我们 | 广告服务 |

建议使用IE 5.0以上浏览器,800×600以上分辨率,法律顾问:上海瀛东律师事务所 张楠律师
版权所有 上海博为峰软件技术有限公司 Copyright@51testing.com 2003-2016, 沪ICP备05003035号
投诉及意见反馈:webmaster@51testing.com   业务联系:service@51testing.com  021-64471599-8017