静态代码检查cppcheck整体了解

cppcheck是一个C++开源的静态代码检查工具。基本上编译器不检查的问题他都检查,效果还是不错的。

工作中用到cppcheck作为代码检查,网上现在能搜到的关于cppcheck相关信息也不多,自己也在这里记录一下。其实引入cppcheck确实能为代码提供一些基本风险检测

比如

 

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

最重要的是还能自己定制项目中对应的规则,这也是我们引入cppcheck的原因。

参考了一些网上的资源cppcheck的基本使用:

https://www.cnblogs.com/freedomabcd/p/7771121.html

http://blog.csdn.net/liang19890820/article/details/52778149

https://sourceforge.net/p/cppcheck/wiki/ListOfChecks/

上面得连接都已经介绍一些cppcheck的基本使用。

 

在这里我就记录一下如何用cppcheck开发定制自己的规则。

原理:Cppcheck先是分析拆解代码,将每个有效字符作为一个token(token是抽象代码中所有字符的类,包含字符的字符串,类型等),提供tokenlist,规则实现者通过匹配需要的字符找到感兴趣的代码,然后通过计算查找bug注意点:

其中Cppcheck会做预处理和简化代码的操作,比如include头文件,展开宏,在每一个token直接用一个空格分隔等。

 

u匹配token一般用Token::Match这个方法,支持一些特定pattern,在声明处有注释

 

开发中使用主要的类有:

 

Tokenizer类: 代码token化, 计划代码

SymbolDatabase类:符号数据库,生成和存储各种符号:scope,function, variable等

Scope类: 各种代码block。最常用的有functionScopes, classAndStructScopes等

Token类: 里面有str(), next(), previous(), tokAt(), link(),Match()等常用函数

Variable类:getTypeString()  --C++相关的代码经常需要

Function类:可以找到实现的scope

Value类: token可以通过getValue()得到可能的值

 

开发其实就是按套路走:

举个例子:除0 bug

1.从函数scope(函数的list)出发,遍历每一个token(符号)

2.使用Token::Match方法和变量类型来判断是否是除号

3.检查使用除号除以的变量是否判0

4.如果没有的话,如果没有判别式否是0那就是bug

 

好多规则都可以按这个套路写。只是如果判别是否是除号,以及如何判断被除的变量是否判0,这个有很多不同的形式,这得根据项目中的代码风格、规则来做对应的判断了。判断的不好会有很多误报或者遗漏。所以自定义规则可能更适合长期开发的大项目。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值