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
}

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

void foo(int x)
{
    int buf[10];
    buf[x] = 0; // <- ERROR
    if (x == 1000) {}
}

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

安装

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

ubuntu下直接apt安装

sudo apt-get install cppcheck

使用

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

cppcheck . 2> err.txt

打开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.

e.g.

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

可以看到打印出的结果的格式变化了,同时对于某些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

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

破落之实

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值