【代码质量】静态代码检测pc-lint, visual lint, cpp-check(pclint、cppcheck、TscanCode)...

本文对比分析了C/C++静态代码扫描工具TscanCode, cppcheck和PCLint,探讨了它们在费用、活跃度、准确性等方面的表现。TscanCode具有较高的有效报错数和准确率,cppcheck和PCLint在某些方面也有所优势。此外,文章还介绍了这些工具的安装与使用方法。" 20068883,1018716,证书认证系统报文传输与接口设计,"['pki', '信息安全', '加密技术']
摘要由CSDN通过智能技术生成

目录

引言 

主流静态代码扫描工具概况 

费用和活跃度

准确性对比

C/C++静态检测/静态分析|TscanCode|cppcheck

TscanCode

Windows下的安装与使用

Linux下的安装与使用

cppcheck

简介

 Linux下的安装与使用

Windows下的安装与使用

cppcheck + jenkins


引言 


静态代码分析是指无需运行被测代码,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,找出代码隐藏的错误和缺陷。

如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。统计证明,在整个软件开发生命周期中,30% 至 70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。

主流静态代码扫描工具概况 


腾讯TSC团队自主研发的tscancode工具、cppcheck、coverity、clang、pclint

费用和活跃度

竞品分析的选择了3款游戏项目(约500万行代码)。 图片描述图片描述

在可扩展性上,TSC有专人维护,定期根据用户需求扩展规则或新增功能特性,cppcheck和clang是开源工具,工具更新较慢,但如果用户有特殊需求可以自己扩展开发,pclint和coverity是商业软件,难以进行功能扩展。

同时,TSC有完整代码质量管理闭环平台QOC支持; coverity和clang可用web端的结果展示,但无法自行管理问题流,需要进行二次开发; cppcheck和pclint缺少web端结果展示。

准确性对比

摘自:【代码质量】C++代码质量扫描主流工具深度比较_腾讯WeTest的博客-CSDN博客_代码质量检查工具

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分]

4.2越界规则 
越界一般来讲是指数组下标越界,或者缓冲区读写越界。这类错误会导致非法内存的访问,引发程序崩溃或者错误。

下图是五个工具对样本代码扫描结果: 图片描述图片描述

有效报错数:coverity[98]>>TSC [18]>pclint[16] >cppcheck[6]> clang[4]

准确率: clang[100%] >coverity[80%]>TSC[70%] >cppcheck[67%]>>pclint[2%]

综合评分:coverity[90分] >TSC[54分]≈clang[55分]>cppcheck[40分]>pclint[1分]

4.3变量未初始化规则 
变量未初始化顾名思义:变量声明后没有赋初值,其分配的内存值是随机的。这也是代码中容易出现的问题,会导致不确定的程序行为,造成严重的后果。

下图是五个工具对样本代码扫描结果: 图片描述图片描述

有效报错数:coverity[75]>>pclint[25] >TSC [9]>cppcheck[8]> clang[1]

准确率: TSC[75%] >coverity[68%]>pclint[26%] > clang[17%] >cppcheck[3%]

综合评分:coverity[82分] > TSC[47分] >pclint[30分] > clang[10分] >cppcheck[6分]

4.4内存/资源泄露规则 
内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存,从而造成了内存浪费的情况。内存泄漏是静态下很难检测的一种错误,一般需要动态分析工具进行检测,如valgrind工具会捕获malloc()/free()/new/delete的调用,监控内存分配和释放,从动态上检测程序是否存在内存泄漏。因此,静态代码分析能检查的内存泄漏就非常有限了,当前各工具主要是从代码写法上检查内存分配和释放是否配对使用。比如:fopen打开文件后在退出函数前是否有执行fclose,new[]和delete[]是否配对使用等。

下图是五个工具对样本代码扫描结果: 图片描述图片描述
注:以上数据排除了cppcheck35个低价值报错,这里排除的cppcheck35个报错都是基本数据类型的new和delete不匹配(如char* p=new char[100];delete p;)虽然这种写法不规范,但由于实际上不会造成内存泄漏,很多项目不会对此进行修复。<

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值