Cppcheck代码分析(1)
一、检查点
1、自动变量检查:
返回自动变量(局部变量)指针
2、越界检查:
数组越界返回自动变量(局部变量)指针
3、类检查:
构造函数初始化
4、内存泄露检查:
5、空指针检查:
6、废弃函数检查
7、其他:
二、Cppcheck 架构分析
总体

三、检查点cppcheck系统C++实现类

参数分析
外部输入
内部抽象classSetings
class Settings
{
…
std::string _append;
std::string userDefines;
std::list<std::string> _includePaths;
std::list<Rule> rules;
…
}
字符交互模式
CmdLineParser parser(&_settings);
四、Cppcheck总过程
预处理
预处理处理由Preprocessor类实现
执行Class Preprocessor::preprocess()
预处理阶段主要处理:
去多余空格
删除汇编代码
处理#Include及嵌套
统一预处理语句(例:#if define=> #ifdef)
提取预处理配置设置(configuration)
替换宏定义
Tokenize
解析代码成符号
由 class Tokenizer实现
实现接口 class Tokenizer::tokenize()
符号:+-*/;…等
变量名
函数名
Simplify
目的:
简化复杂代码
统一化
由 class Tokenizer实现
实现接口 class Tokenizer::simplifyTokenList()
Simplify规则
对变量
对条件循环语句if 、for、while
五、Cppcheck 核心类class cppcheck
核心函数check()
处理入口,在此函数对输入代码进行初步分析处理,最后将代码传递给 CheckFile().
核心函数CheckFile()
函数功能是分析一个代码文件, CheckFile()会将代码流做进一步的分析,做tokenize,simplify,处理后分析代码,报告错误
Class cppcheck::check()函数 &class cppcheck:: CheckFile()函数的实现

Cppcheck 检查实现类check
Cppcheck核心类check

Class check
protected:
const std::string _name;
const Tokenizer * const _tokenizer;
const Settings * const _settings;
ErrorLogger * const _errorLogger;
virtual void runChecks(****){ } //不是所有check子类都会实现
virtual void runSimplifiedChecks(***) = 0; //所有check子类都会实现
void reportError() //报告误差,所有check子类都会用到
virtual void getErrorMessages(****) = 0; //所有check子类都会实现,最终都会调用reportError()
Void runChecks()
主要是检查经过tokenize,但未经过simplify的代码流
Void runSimplifiedChecks()
主要是检查经过tokenize,但未经过simplify的代码流
用户扩展接口
CheckOther : public Check
……
virtual void runChecks(****){ } //实现
virtual void runSimplifiedChecks(***) = 0; //实现
添加检查函数方法:
void runChecks(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger)
{
CheckOther checkOther(tokenizer, settings, errorLogger);
// Coding style checks
checkOther.warningOldStylePointerCast();
checkOther.checkUnsignedDivision();
checkOther.addcheck();
…
}
Cppcheck代码分析(1)的更多相关文章
- Cppcheck代码分析上
1.检查点 1.自动变量检查: 返回自动变量(局部变量)指针: 2.越界检查:数组越界返回自动变量(局部变量)指针: 3.类检查:构造函数初始化: 4.内存泄露检查: 5.空指针检查: 6.废弃函数 ...
- Cppcheck代码分析下
1.流解析 解析函数中的可能的代码执行流, 函数实际执行中只会执行代码流中的一条流 分析: 分支语句 if-else ,switch-case 循环语句 while, do-while ...
- Cppcheck代码分析(2)
功能 解析函数中的可能的代码执行流 函数实际执行中只会执行代码流中的一条流 分析: 分支语句 if-else ,switch-case 循环语句 while, do-while ,for 代码流举例 ...
- C++静态代码分析工具对比cppCheck与PreFast
具体内容参看文件<CppCheck和PreFast对Cplusplus代码静态分析测试.zip> C++测试源代码main.cpp #define NULL 0 #include < ...
- Cppcheck 1.54 C/C++静态代码分析工具
Cppcheck是一个C/C++代码分析工具,只检测那些编译器通常无法检测到的bug类型. 官方上建议让编译器提供尽量多的警告提示:1.使用Visual C++的话,应使用警告等级4 2.使用GC ...
- C++静态代码分析工具推荐——PVS-Studio
长假归来,最近一直没更新,节前本来就想写这篇了,一直到今天才有时间. 关于静态代码分析在维基百科上可以查到很详细的介绍:https://en.wikipedia.org/wiki/List_of_to ...
- Android代码分析工具lint学习
1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...
- pmd静态代码分析
在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明 Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可 ...
- [Asp.net 5] DependencyInjection项目代码分析-目录
微软DI文章系列如下所示: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Autofac [ ...
随机推荐
- 【数学】[BZOJ 3884] 上帝与集合的正确用法
Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”.“α”被定义为“元” ...
- PAT-乙级-1006. 换个格式输出整数 (15)
1006. 换个格式输出整数 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们用字母B来表示“百” ...
- HDU1565+状态压缩dp
简单的压缩状态 dp /* 状态压缩dp 同hdu2167 利用滚动数组!! */ #include<stdio.h> #include<string.h> #include& ...
- net.sf.json.JSONException: Object is null
出现这个错误的原因是net.sf.json.JSONArray或JSONObject转换时,对象内包含另一个对象,而该被包含的对象为NULL,所以抛出异常. 补充: 最可恨的是,明明转换的时候已经成功 ...
- mybatis怎样配置数据库集群
场景:一个读数据源一个读写数据源. 原理:借助spring的[org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource] ...
- 你不知道的pogo pin连接器
pogo pin连接器是一种带弹簧的探针式连接器,pogo pin连接器结构看起来非常简单,但其制造工艺要求极其的精细与复杂,从车床加工,电镀,组装等每道工序,如果没有一个有良好品质控制和完善的制造水 ...
- ArrayList源代码深入剖析
第1部分 ArrayList介绍ArrayList底层采用数组实现,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAccess, Cloneable, java. ...
- 概率图模型之有向图与无向图之间的关系 I map D map perfect map(完美图) 概念
我们已经讨论了有向图和无向图框架下的概率模型,那么我们有必要讨论一下它们二者的关系.
- [译]好程序员的五声“呐喊”
通常编程情况下,会导致软件项目变坏的一些列反应 原文:The five shouts of good programmers 在任何一天,在这个世界上都有软件项目正在失败,这很常见.常见到当软件产品按 ...
- ORACLE和SQL SERVER的数据同步常用方法
ORACLE和SQL SERVER的数据同步常用方法 1. 自己编程,或者第三方工具2. 在sqlserver中,使用linkedserver,访问oracle,然后编写job进行数据同步3. 在or ...
