码迷,mamicode.com
首页 > 其他好文 > 详细

Cppcheck代码分析(1)

时间:2015-07-20 12:49:11      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

一、检查点

  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)

标签:

原文地址:http://www.cnblogs.com/ChinaHook/p/4661030.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!