一、检查点

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)的更多相关文章

  1. Cppcheck代码分析上

    1.检查点 1.自动变量检查: 返回自动变量(局部变量)指针: 2.越界检查:数组越界返回自动变量(局部变量)指针: 3.类检查:构造函数初始化: 4.内存泄露检查:  5.空指针检查: 6.废弃函数 ...

  2. Cppcheck代码分析下

    1.流解析 解析函数中的可能的代码执行流, 函数实际执行中只会执行代码流中的一条流 分析: 分支语句 if-else ,switch-case         循环语句 while, do-while ...

  3. Cppcheck代码分析(2)

    功能 解析函数中的可能的代码执行流 函数实际执行中只会执行代码流中的一条流 分析: 分支语句 if-else ,switch-case 循环语句 while, do-while ,for 代码流举例 ...

  4. C++静态代码分析工具对比cppCheck与PreFast

    具体内容参看文件<CppCheck和PreFast对Cplusplus代码静态分析测试.zip> C++测试源代码main.cpp #define NULL 0 #include < ...

  5. Cppcheck 1.54 C/C++静态代码分析工具

    Cppcheck是一个C/C++代码分析工具,只检测那些编译器通常无法检测到的bug类型.   官方上建议让编译器提供尽量多的警告提示:1.使用Visual C++的话,应使用警告等级4 2.使用GC ...

  6. C++静态代码分析工具推荐——PVS-Studio

    长假归来,最近一直没更新,节前本来就想写这篇了,一直到今天才有时间. 关于静态代码分析在维基百科上可以查到很详细的介绍:https://en.wikipedia.org/wiki/List_of_to ...

  7. Android代码分析工具lint学习

    1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...

  8. pmd静态代码分析

    在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明 Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可 ...

  9. [Asp.net 5] DependencyInjection项目代码分析-目录

    微软DI文章系列如下所示: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Autofac [ ...

随机推荐

  1. http://blog.csdn.net/itplus/article/details/10088625

    http://blog.csdn.net/itplus/article/details/10088625 DBSCAN

  2. hdu 4726

    贪心 不是很难  各种细节注意 #include <cstdio> #include <cstring> #include <algorithm> using na ...

  3. socket选项自带的TCP异常断开检测

    TCP异常断开是指在突然断电,直接拔网线等等情况下,如果通信双方没有进行数据发送通信等处理的时候,无法获知连接已经断开的情况. 在通常的情况下,为了使得socket通信不受操作系统的限制,需要自己在应 ...

  4. 【Visual C++】一些开发心得与调试技巧

    自己平时收集的一些技巧与心得,这里分享出来,普及一下知识. 1.如何在Release状态下进行调试 Project->Setting=>ProjectSetting对话框,选择Releas ...

  5. Oracle 学习笔记(一)

    1.连接数据库命令: conn 用户名/密码,当用特权身份连接时,要加上as sysdba 2.修改密码: passw(ord),如果要修改其他人的密码,需要用sys或者system登录 3.显示当前 ...

  6. 李洪强漫谈iOS开发[C语言-013]-常量

    // //  main.m //  09 - 常量 // //  Created by 李洪强 on 16/7/17. //  Copyright © 2016年 李洪强. All rights re ...

  7. win7 64bit下最新Apahe2.4.18+php7.0.2+MySQL5.7.10配置

    原文:win7 64bit下最新Apahe2.4.18+php7.0.2+MySQL5.7.10配置 一.说明 以前配置apache+php+mysql都是参考网上的,一般都没有什么问题.最近公司有个 ...

  8. python学习笔记四--元组

    一.元组: 1. 不可变更的列表 2. 从语法上,她们是编写在小括号里,不是方括号里,列表是编写在方括号里的 3. 圆括号也同时用于表达式,如果想说明这是一个元组,不是表达式,可以在value后,关闭 ...

  9. 大四实习准备2_java异常处理_android控件练习

    2015-4-24 Java 异常处理 可以有多个catch;ArrayIndexOutOfBoundsException类是Exception类的子类RuntimeException类的一个间接子类 ...

  10. js不能执行,IE处理方法

    一.如果你的ie不能打开js脚本(连系统里所有的js文件都不运行,网页上的js广告或好多页面都显示不了),请按一下步骤进行排查与解决: 1.查看是否IE的安全里面禁止了JS的运行: 将工具=>i ...