• 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();
    
            …
    }
  • 相关阅读:
    linux 中字符映射错误,#、、|、“ 不能输入
    Qt::Key_Return Qt::Key_Enter 区别
    如何监控系统用户实时执行的Linux命令
    a3考卷转2张a4
    kali
    字典序最小问题(贪心)
    nmap 目标指定
    debian 系统安装最新版本nmap方法:
    TransCAD是由美国Caliper公司开发的一套强有力的交通规划和需求预测软件
    GIS 地图的图层(切片/瓦片)概念
  • 原文地址:https://www.cnblogs.com/ChinaHook/p/4661030.html
Copyright © 2020-2023  润新知