现在的位置: 首页 > 综合 > 正文

cppchecker简单介绍和原理初窥

2013年11月27日 ⁄ 综合 ⁄ 共 788字 ⁄ 字号 评论关闭

1. 概述:
c/c++代码静态分析工具,用于检查编译器难以觉察的bug,其设计目标是没有漏报

2. 准确率:
不能包治百病,但配合testing、instrumenting,可以极大减少bug

3. 检查内容:
  • 64位兼容性
  • 自动变量生存周期检查
  • 数组越界检查
  • 类检查,包括缺少构造函数,变量在构造函数中是否初始化及其初始化顺序,基类析构函数是否为虚函数等
  • 异常安全检查
  • IO检查:sprintf、scanf是否检点,使用close了的文件,向只读文件中写数据,对输入流使用fflush等
  • 自动变量内存泄露:检查自动变量被分配但没有被释放
  • 内存泄露:申请的内存地址传递错误,构造器中分配的内存必须在析构器中释放,struct成员指向某个内存时候释放struct也必须释放成员指向的内存
  • 不可重入函数(strtok等)使用警告、废弃函数(bcopy等)使用警告
  • 空指针引用
  其它检查:

  • bool转指针
  • 除零
  • 引用对象提前被析构
  • assert语句内的赋值
  • double free
  • 冗余拷贝const
  • 不兼容指针类型的转换
  • 重复的if
  • 总为真、假的条件
  • sizeof内的计算
  • 自赋值
  • 不可达的死代码
  • etc


设计文档:

cppchecker是一个静态检查工具,并且没有对代码流进行分析,假设所有代码都是可达的,if()的分隔作用被无视。因此,一些难找的bug会被发现,一些本不是bug的内容也可能会给warning,不必惊慌。
if (myvar == NULL)
{
     WARN("wrong");
}
myvar->hello();
myvar可能为NULL会被检测到。
OceanBase用cppchecker跑了一遍,这种NULL的引用基本都被检测到了。cppchecker is a quick learner.

抱歉!评论已关闭.