• cppcheck的安装及基本使用


    本文主要介绍cppcheck这款C/C++源码静态分析工具的安装及基本使用方法。

    其github仓库:https://github.com/danmar/cppcheck

    官网:https://cppcheck.sourceforge.io/

    cppcheck简介

    cppcheck的特色是使用unsound 的流敏感的分析。其他的工具基于IR层使用路径敏感的分析,有其优点也有不足。理论上,路径敏感的分析要优于流敏感的分析。但在实际中,cppcheck会检测到其他工具没检测的漏洞。

    在cppcheck中,数据流分析不是前向的,而是双向的。比如下面的代码,cppcheck和大多数的分析器一样,都会发现缓冲区溢出。

    void foo(int x)
    {
        int buf[10];
        if (x == 1000)
            buf[x] = 0; // <- ERROR
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    而结合了双向数据流分析的cppcheck也能够发现下面的代码的缓冲区溢出。

    void foo(int x)
    {
        int buf[10];
        buf[x] = 0; // <- ERROR
        if (x == 1000) {}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    cppcheck能检测的bug类型,可以在该网址找到:https://sourceforge.net/p/cppcheck/wiki/ListOfChecks/

    安装

    官网有给出多种系统的安装方式

    ubuntu下直接apt安装

    sudo apt-get install cppcheck
    
    • 1

    使用

    检测当前文件夹所有的c代码,并将结果保存在err.txt中。

    cppcheck . 2> err.txt
    
    • 1

    打开err.txt,能看到检测的结果如下:

    会发现有些小乱,可以指定template模板来指定输出的格式模板。

    --template=''  Format the error messages. Available fields:
                               {file}              file name
                               {line}              line number
                               {column}            column number
                               {callstack}         show a callstack. Example:
                                                     [file.c:1] -> [file.c:100]
                               {inconclusive:text} if warning is inconclusive, text
                                                   is written
                               {severity}          severity
                               {message}           warning message
                               {id}                warning id
                               {cwe}               CWE id (Common Weakness Enumeration)
                               {code}              show the real code
                               \t                 insert tab
                               \n                 insert newline
                               \r                 insert carriage return
                             Example formats:
                             '{file}:{line},{severity},{id},{message}' or
                             '{file}({line}):({severity}) {message}' or
                             '{callstack} {message}'
                             Pre-defined templates: gcc (default), cppcheck1 (old default), vs, edit.
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    e.g.

    cppcheck . --template="{id} {file}:{line},{severity},{callstack}" 2> err.txt
    
    • 1

    可以看到打印出的结果的格式变化了,同时对于某些bug,还可以打印出他的callstack。

    另外一个有用的选项是enable,可以选择开启哪些checker。

    --enable=<id>        Enable additional checks. The available ids are:
                              * all
                                      Enable all checks. It is recommended to only
                                      use --enable=all when the whole program is
                                      scanned, because this enables unusedFunction.
                              * warning
                                      Enable warning messages
                              * style
                                      Enable all coding style checks. All messages
                                      with the severities 'style', 'performance' and
                                      'portability' are enabled.
                              * performance
                                      Enable performance messages
                              * portability
                                      Enable portability messages
                              * information
                                      Enable information messages
                              * unusedFunction
                                      Check for unused functions. It is recommend
                                      to only enable this when the whole program is
                                      scanned.
                              * missingInclude
                                      Warn if there are missing includes. For
                                      detailed information, use '--check-config'.
                             Several ids can be given if you separate them with
                             commas. See also --std
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    艾尔登法环约定之王拉塔恩打法
    ROS 代码调试常用方式配置
    【Linux】ps -ef 和ps aux 有什么不同呢?
    pdf导出实例(itestpdf)
    【路径规划】基于粒子群结合遗传算法实现机器人栅格地图路径规划
    【软考 系统架构设计师】系统可靠性分析与设计② 可靠性设计
    微服务保护-热点参数限流
    Docker 容器全部停止命令
    Spring如何使用环境变量控制配置文件加载呢?
    动态邮件发送
  • 原文地址:https://blog.csdn.net/u013648063/article/details/126244614