cppcheck代码检查工具安装与使用技巧

cppcheck代码检查工具安装与使用技巧

Cppcheck 是一种 C/C++ 代码缺陷静态检查工具。不同于 C/C++ 编译器及很多其它分析工具,它不检查代码中的语法错误。
Cppcheck 可以检查非标准代码,包括不同的编译器扩展、内联汇编代码等。 Cppcheck 可以检测到在测试和评估软件时错过的一些 bug。

setup cppcheck under Ubuntu

  1. install
    sudo apt-get install cppcheck

  2. alias a short command
    定义自己的快捷命令,根据个人需要选择以下语句中的一个添加到~/.bashrc

  • 将使用默认规则对列表文件执行代码检查,错误生成到~/cppcheck.xml文件,其中需要自己提供文件列表
alias mcppcheck='cppcheck --enable=all --inconclusive --xml --xml-version=2 2>~/cppcheck.xml '
  • 查找当前目录下的.h.cpp文件并作为c++语言进行检查,输出格式同gcc的输出
alias mcppcheck='cppcheck --enable=all --language=c++ --inconclusive --template=gcc $(find . -type f -name \*.cpp -o -name google -prune -o -name autogenerate -prune)'
  • 查找当前目录下的".cpp"文件并作为c++语言进行检查,输出格式同gcc的输出,输出到终端标准输出
function mcppcheck()
{
    if [ "$(which cppcheck)" = "" ] ;then
        cppcheck
        return
    fi

    local level=all #warning
    local language=c++
    local template=gcc
    local files="$(find . -type f -name \*.\[hc\]pp -o -name google -prune -o -name autogenerate -prune)"
    # error stream write to xml
    # cppcheck --enable=all --inconclusive --xml --xml-version=2 2>cppcheck.xml ${files}
    # cppcheck-htmlreport --file cppcheck.xml --report-dir=~/cppcheck-htmlreport

    cppcheck --enable=${level} \
        --language=${language} \
        --inconclusive --template=${template} \
        ${files}
}
  • 查找当前目录下的".cpp"文件并作为c++语言进行检查,输出到xml文件,且一同输出html格式报告到目录~/cppcheck-htmlreport
function mcppcheckhtmlreport()
{
    if [ "$(which cppcheck)" = "" ] ;then
        cppcheck
        return
    fi

    local level=all #warning
    # local standard=c++11 # default is c++20
    local language=c++
    local files="$(find . -type f -name \*.\[hc\]pp -o -name google -prune -o -name autogenerate -prune)"
    local project=$(basename $(pwd))
    local timestamp=$(date \+%F_%T)
    local report_dir=~/cppcheck-htmlreport/${timestamp//:/}-${project}
    local xmlfile=${report_dir}/cppcheck-${project}.xml

    [ ! -f ${report_dir} ] && mkdir -p ${report_dir}

    cppcheck --enable=${level} \
        --language=${language} \
        --inconclusive --xml --xml-version=2 2>${xmlfile} \
        ${files}

    cppcheck-htmlreport --file ${xmlfile} --title "${project} ${timestamp}" --report-dir=${report_dir}
}

注意:cppcheck官方不建议对".h"头文件进行检查。

setup cppcheck for windows

http://cppcheck.net/

具体使用说明

检查时排除某个文件或文件夹

排除一个文件或文件夹有两个选项,

  • 方式1:是只提供你想检查的路径和文件:

cppcheck src/a src/b
所有位于 src/a 和 src/b 下的文件都会被检查。

  • 方式2:使用 -i 选项

这时,将会忽略指定的文件/文件夹,使用下面命令在 src/c 将不会被检查:

cppcheck -isrc/c src

严重性

可能的严重性消息有:

  • 错误:当发现 bug 时使用
  • 警告:关于防御性编程,以防止 bug 的建议
  • 风格警告:风格有关问题的代码清理(未使用的函数、冗余代码、常量性等等)
  • 可移植性警告:可移植性警告。64 位的可移植性,代码可能在不同的编译器中运行结果不同。
  • 性能警告:建议使代码更快。这些建议只是基于常识,即使修复这些消息,也不确定会得到任何可测量的性能提升。
  • 信息消息:配置问题,建议在配置期间仅启用这些。

启用消息

默认情况下,只显示错误消息,可以通过 --enable 命令启用更多检查。

  • 启用警告消息:cppcheck --enable=warning file.c
  • 启用性能消息:cppcheck --enable=performance file.c
  • 启用信息消息:cppcheck --enable=information file.c

由于历史原因 --enable=style 可以启用警告、性能、可移植性和样式信息。当使用旧 XML 格式时,这些都由 style 表示:cppcheck --enable=style file.c

  • 启用警告和性能消息:cppcheck --enable=warning,performance file.c
  • 启用 unusedFunction 检查。这不能通过 --enable=style 启用,因为不会在库中正常工作。cppcheck --enable=unusedFunction file.c
  • 启用所有消息:cppcheck --enable=all

不确定消息

默认情况下,如果确定,Cppcheck 只显示错误消息。如果使用 --inconclusive,当分析不确定时,也会写错误消息。

cppcheck --inconclusive path
这当然会导致错误的警告,即使在没有 bug 的情况下,也可能会报 bug。如果可以接受错误的警告,可以使用此命令。

保存结果到文件中

很多时候,会希望将结果保存在一个文件中,可以使用 shell 的管道重定向错误输出到一个文件:

cppcheck file.c 2> err.txt

多线程检查

选项 -j 用于指定需要使用的线程数,例如,使用 4 个线程检查文件夹中的文件:
cppcheck -j 4 path

注意:这将禁用 unusedFunction 检查。

XML 输出

Cppcheck 可以生成 XML 格式的输出。有一个旧的 XML 格式(version 1)和一个新的 XML 格式(version 2)。如果可以,请使用新版本。
旧版本保持向后兼容性。它不会改变,但有一天可能会被删除。使用 --xml 支持这种格式。

新版本修复一些旧格式的问题。新格式可能会在 cppcheck 的未来版本中更新,并带有新的属性和元素。用于检查文件并以新的 XML 格式输出错误的示例命令:cppcheck --xml-version=2 file.cpp

这是一个 version 2 示例:

<?xml version="1.0" encoding="UTF-8"?>
<results version="2">
<cppcheck version="1.82">
<errors>
  <error id="syntaxError" severity="error" msg="syntax error" verbose="syntax error">
    <location file="algorithm/autogenerate/source/message.pb.cpp" line="2296"/>
  </error>
</errors>
</results>

<error> 元素

每个错误都在 <error> 元素中,属性:

  • id: 错误的 id,这些都是有效的符号名称。
  • severity: error、warning、style、performance、portability、information 中的任何一个。
  • msg: 短格式的错误消息
  • verbose: 长格式的错误消息
  • inconclusive: 此属性仅在消息不确定时使用
  • cwe: 消息的 CWE ID,此属性仅在消息的 CWE ID 已知时使用。

<location> 元素

<location> 元素列出所有错误相关位置,首先列出主要位置。
属性:

  • file: 文件名,相对路径和绝对路径都是可能的。
  • file0: 源文件的名称(可选)
  • line: 一个数字
  • msg: 此属性尚不存在,但将来可以为每个位置添加一条短消息。

格式化输出

如果想重新格式化输出,使它看起来不同,可以使用模板。

  • 要获得 Visual Studio 兼容的输出,可以使用 --template=vs:
    cppcheck --template=vs gui/test.cpp
    输出将如下所示:
Checking gui/test.cpp…
gui/test.cpp(31): error: Memory leak: b
gui/test.cpp(16): error: Mismatching allocation and deallocation: k
  • 要获得 gcc 兼容的输出,可以使用 --template=gcc:
    cppcheck --template=gcc gui/test.cpp
    输出将如下所示:
Checking gui/test.cpp…
gui/test.cpp:31: error: Memory leak: b
gui/test.cpp:16: error: Mismatching allocation and deallocation: k
  • 可以编写自己的模式(例如,逗号分隔格式):
cppcheck --template="{file},{line},{severity},{id},{message}" gui/test.cpp

输出将如下所示:

Checking gui/test.cpp…
gui/test.cpp,31,error,memleak,Memory leak: b
gui/test.cpp,16,error,mismatchAllocDealloc, Mismatching allocation and deallocation: k

支持以下格式说明符:

  • callstack: 调用栈 - 如果可用
  • file : 文件名
  • id : 消息 id
  • line : 行号
  • message: 详细的消息文本
  • severity: 一个消息的类型/等级
  • 支持转义序列: \b(退格)、\n(换行)、\r(换页)、\t(水平制表符)。

more

ref: http://cppcheck.net/
ref: https://cppcheck.sourceforge.io/manual.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值