首页 > 其他分享 >cppchecker简单介绍和原理初窥

cppchecker简单介绍和原理初窥

时间:2023-06-19 10:06:26浏览次数:40  
标签:检查 内存 简单 myvar 原理 cppchecker NULL bug


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






设计文档:


http://jaist.dl.sourceforge.net/project/cppcheck/Articles/cppcheck-design.pdf





cppchecker是一个静态检查工具,并且没有对代码流进行分析,假设所有代码都是可达的,if()的分隔作用被无视。因此,一些难找的bug会被发现,一些本不是bug的内容也可能会给warning,不必惊慌。


if (myvar == NULL)
{
     WARN("wrong");
}
myvar->hello();


myvar可能为NULL会被检测到。


OceanBase用cppchecker跑了一遍,这种NULL的引用基本都被检测到了。cppchecker is a quick learner.



标签:检查,内存,简单,myvar,原理,cppchecker,NULL,bug
From: https://blog.51cto.com/maray/6510877

相关文章

  • 用户态多线程实现的基本原理
    本文参考了用户态非抢占式线程库实现一文以及GNUPth。前者是一种用户态线程库的简单实现,属于一个很好的demo,后者就是大家熟知的Pthread的用户态实现,比较完善。 Keywords:User-SpaceMultiThreading,Pth 所谓多线程,简单讲就是能够让几个不同的代码片段轮流执行。内核实现多线......
  • JS(简单数据类型、数据类型转换)
    一.数据类型简介1.1为什么需要数据类型在计算机中,不同的数据所需占用的存储空间是不同的,为了便于把数据分成所需内存大小不同的数据,充分利用存储空间,于是定义了不同的数据类型。简单来说,数据类型就是数据的类别型号。比如姓名“张三”,年龄18,这些数据的类型是不一样的。1.2变......
  • 【Unity3D】阴影原理及应用
    1阴影原理​光源照射到不透明物体上,会向该物体的后面投射阴影,如果阴影区域存在其他物体,这些物体不被光源照射的部分就需要渲染阴影。因此,我们可以将阴影的生成抽象出2个流程:物体投射阴影、物体接收阴影。1.1阴影相关开关​1)开启Light组件渲染阴影NoShadows......
  • k8s 深入篇———— 一些容器操作的原理[三]
    前言简单介绍一下一些容器的操作原理。正文dockerexec是怎么做到进入容器里的呢。比如说:这里有一个容器,我们可以exec进去:dockerexec-itb265/bin/sh我们为什么能看到和容器内部一样的场景呢?首先我们知道了为什么容器进程只能看到规定的namespace了,那么如果我们......
  • nginx-clojure debug构建简单说明
    实际上参考了官方的构建参数,提供一个debug模式的文件原始配置configurearguments:--prefix=--sbin-path=nginx--conf-path=conf/nginx.conf--error-log-path=logs/error.log--http-log-path=logs/access.log--pid-path=logs/nginx.pid--lock-path=logs/nginx.lock--http-......
  • SpringBoot自动配置的原理
    以WebMvcAutoConfiguration自动配置的原理为例,SpringBoot内部对大量的第三方库或Spring内部库进行了默认配置,这些配置是否生效,取决于我们是否引入了对应库所需的依赖,如果有那么默认配置就会生效。如果引入springboot-starter-web那么对应的web配置就会自动配置。那么是如何自动配......
  • per-CPU变量的静态和动态分配原理
    per-CPU是2.6内核中引入的,访问per-CPU变量几乎不需要锁,每个处理器都在其自己的副本上工作。这些副本是如何生成的呢?本文尝试解答这个问题。静态per-CPU结构设计思路大体可以分为两个阶段:编译阶段和运行时阶段在编译阶段,实际上只生成了一个CPU原本。系统中所有per-CPU结构都放到了一......
  • kafka工作原理
    1.工作流程以及文件存储机制 kafka中的消息是以topic进行分类的,生产消费消息都是面向topic。 topic是逻辑上的概念,partition分区是物理上的概念,每个分区对应一个log文件,该log文件存储的就是producer生产的log数据。producer生产的数据会追加到文件末端。消费者组中的每个消费......
  • JWT的简单理解
    JWT简介是什么?1.翻译官网地址:https://jwt.io/introduction/翻译:jsonwebtoken(JWT)是一个开放标准(rfc7519),它定义了一种紧凑的、自包含的方式,用于在各方之间以JSON对象安全地传输信息。此信息可以验证和信任,因为它是数字签名的。jwt可以使用秘密(使用HMAC算法)或使用RSA或EC......
  • 编译原理实验二 使用lex创建词法分析器
    实验二直接上代码吧,其实我也不怎么知道哪里是致命的,课上听老师的课后,将代码写上,但是运行在环境里面还是不行,把注释去掉就可以了,不知道会不会是注释的问题%{#include<stdio.h>#include"define.h"intlineno=1; TokenTypeid2keyword(constchar*token);%}newline ......