cppcheck的安装及基本使用

admin 2023年9月21日19:20:33cppcheck的安装及基本使用已关闭评论22 views字数 2172阅读7分14秒阅读模式

本文主要介绍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='<text>'  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

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年9月21日19:20:33
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   cppcheck的安装及基本使用https://cn-sec.com/archives/2055387.html