Cppcheck代码分析上

1、检查点

  1、自动变量检查: 返回自动变量(局部变量)指针;

   2、越界检查:数组越界返回自动变量(局部变量)指针;

   3、类检查:构造函数初始化;

   4、内存泄露检查;

   5、空指针检查;

   6、废弃函数检查;

   7、其他。

2、Cppcheck 架构分析

  2.1 总体类图

 

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

 

  参数分析&外部输入

  内部抽象classSetings

class Settings

{

  …

  std::string _append;

  std::string userDefines;

  std::list<std::string> _includePaths;

  std::list<Rule> rules;

  …

}

  字符交互模式
  CmdLineParser parser(&_settings);

4、Cppcheck总过程

4.1 预处理

  预处理处理由Preprocessor类实现

  执行Class Preprocessor::preprocess()

  预处理阶段主要处理:

  •    去多余空格
  •    删除汇编代码
  •    处理#Include及嵌套
  •    统一预处理语句(例:#if define=> #ifdef)
  •    提取预处理配置设置(configuration)
  •    替换宏定义

4.2 Tokenize

  解析代码成符号,由 class Tokenizer实现,实现接口 class Tokenizer::tokenize()

  • 符号:+-*/;…等;
  • 变量名;
  • 函数名。

4.3 Simplify

  目的:简化复杂代码,   统一化

  由 class Tokenizer实现,实现接口 class Tokenizer::simplifyTokenList()

  Simplify规则:对变量;对条件循环语句if 、for、while

5、Cppcheck 核心类

  核心函数check()

  处理入口,在此函数对输入代码进行初步分析处理,最后将代码传递给 CheckFile()。

  核心函数CheckFile()

  函数功能是分析一个代码文件, CheckFile()会将代码流做进一步的分析,做tokenize,simplify,处理后分析代码,报告错误。

  Class cppcheck::check()函数  &class cppcheck:: CheckFile()函数的实现



  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();

        …
}
原文地址:https://www.cnblogs.com/ChinaHook/p/4661030.html