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

2023-05-16

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cppcheck代码检查工具安装与使用技巧 的相关文章

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

    cppcheck代码检查工具安装与使用技巧 Cppcheck 是一种 C C 43 43 代码缺陷静态检查工具 不同于 C C 43 43 编译器及很多其它分析工具 xff0c 它不检查代码中的语法错误 Cppcheck 可以检查非标准代码
  • 【Makefile】解决ubuntu16.04源码安装cppcheck报错 Makefile322: *** FILESDIR must be set!

    安装参考 xff1a https blog csdn net fengbingchun article details 77803920 安装步骤 xff1a 1 github下载源码 git clone https github com
  • cppcheck代码检查工具安装与使用技巧

    cppcheck代码检查工具安装与使用技巧 Cppcheck 是一种 C C 43 43 代码缺陷静态检查工具 不同于 C C 43 43 编译器及很多其它分析工具 xff0c 它不检查代码中的语法错误 Cppcheck 可以检查非标准代码
  • CppCheck代码静态检测工具

    文章目录 一 简述 二 安装 二 使用 2 1 第一个测试程序 2 2 检查文件夹中所有文件 2 3 检查部分或过滤部分文件 三 严重性 四 其他常用用法 4 1 启用其他检查 4 2 保存结果到文件 4 3 多线程检查 4 3 设置目标平
  • cppcheck支持MISRA C 2012

    1 从官网下载cppcheck安装包然后安装 cppcheck官网 https sourceforge net projects cppcheck 下载windows平台的安装包后 双击安装包文件 安装 默认会安装GUI版本 安装完成后 需
  • C/C++代码缺陷静态检查工具cppcheck

    cppcheck介绍和安装 CppCheck是一个C C 代码缺陷静态检查工具 静态代码检查是检查代码是否安全和健壮 是否有隐藏问题 CppCheck只检查编译器检查不出来的bug 不检查语法错误 CentOS在线安装命令 yum inst
  • 静态分析工具Cppcheck在Windows上的使用

    之前在https blog csdn net fengbingchun article details 8887843 介绍过Cppcheck 那时还是1 x版本 现在已到2 x版本 这里再总结下 Cppcheck是一个用于C C 代码的静
  • [ Linux ] 静态代码检测工具 —— Cppcheck工具

    文章目录 cppcheck工具介绍 Linux安装 linux使用示例 在makefile中添加cppcheck工具实例 cppcheck工具介绍 什么是静态代码检查 静态代码检查是指在不运行程序的条件下 进行程序分析的方法 有些程序分析需
  • scanf Cppcheck警告

    Cppcheck 显示 scanf 的以下警告 Message scanf without field width limits can crash with huge input data To fix this error messag
  • 为什么Cppcheck没有发现这个明显的数组越界错误?

    我安装了Cppcheck http cppcheck sourceforge net 我的 C 项目的静态代码分析工具 感觉它的性能很差 例如 谁能告诉我whyCppcheck无法在以下代码中找到数组越界错误 void f int c ch
  • 我可以在函数头中包含 cppcheck 抑制吗?

    我添加了一个内联注释来抑制函数的 cppcheckusedFunction 警告 但我想将其包含在函数头中 以便 Doxygen 可以记录所有未使用的函数 我正在实现一个 API 所以我有很多函数不会在我的源代码中使用 我不想抑制所有未使用
  • Cppcheck 内联抑制不起作用

    示例代码 class Foo cppcheck suppress noExplicitConstructor Foo int foo Cpp检查调用 cppcheck exe enable all foo cpp Checking foo
  • 当另一个函数返回指针时未检测到空指针取消引用问题

    我使用 SonarQube 5 1 和 cppecheck 1 70 来分析 C 代码 在以下示例中 存在应由 SonarQube 和 或 Cppcheck 由 Sonar 使用 检测到的空指针取消引用问题 但 SonarQube 没有发现
  • 如何使用CMAKE_EXPORT_COMPILE_COMMANDS?

    我一直在尝试使用clang modernize with CMAKE EXPORT COMPILE COMMANDS按照该工具的帮助中的建议 使用此选项 cmake 生成一个包含编译信息 如包含路径 的 JSON 文件 see also h
  • cppcheck 的规则集

    cppcheck允许你创建自己的规则文件 但我不知道cppcheck的功能暴露了多少 是否有人正在开发一套可以强制执行的JSF http www stroustrup com JSF AV rules pdf or MISRA http w
  • C++ 可能的空指针取消引用

    我对一些代码运行了 cppcheck 以查找可能的运行时错误 在以下情况下 它报告可能存在空指针取消引用 Foo x defined somewhere Foo y x possible null pointer dereference 编
  • 动态数组:使用 realloc() 无内存泄漏

    我使用 realloc 来调整分配的内存大小 char get channel name void char result int n result char 0 for elem snd mixer first elem handle n
  • 确定“未知的评估顺序”

    从版本 1 80 开始 Cppcheck 告诉我 表达式 msg ipos checksum msg 1 ipos 1 取决于副作用的评估顺序 在此代码序列中 简化 data是一个变量 BYTE msg MAX MSG SIZE msg c
  • 使用 sscanf 读取数字怎么会崩溃?

    Cppcheck 检测到代码中存在潜在问题 如下所示 float a b c int count sscanf data f f f a b c 它说 没有字段宽度限制的 scanf 可能会因大量数据而崩溃 这怎么可能 这是某些 sscan
  • 在 C 程序中追踪数组越界访问/写入的推荐方法

    考虑用 C 语言编写一些不太明显的算法的实现 例如 让它成为递归快速排序 我在 K N King 的 C 编程 现代方法 第二版 书中找到了它 可以从here http knking com books c2 programs qsort

随机推荐

  • AtCoder褐名记

    今年四月份开始参加AtCoder比赛 xff0c 至今参加了9次 在第9次结束后 xff0c 涨了一级 xff0c 从最低级的灰名涨到倒数第二级的褐名 相对于我这样的新手而言 xff0c AtCoder比TopCoder和Codeforce
  • 基于FFmpeg H264 + G711A 音视频裸流合并 MP4文件 ( G711A 转 AAC)

    由于 FFmpeg 只支持H264 43 AAC的mp4封装格式的 xff0c 并不支持H264 43 G711的mp4封装格式 所以需要将G711a转码成AAC格式的 然后封装成mp4文件 xff0c 但网上有说 通过修改movenc c
  • YOLOV3 网络结构学习笔记

    注 xff1a 本文非原创 xff0c 文章内容都是引用以下文章中 xff0c 本文只是记录学习笔记 yolo系列之yolo v3 深度解析 木盏的博客 CSDN博客 yolo3 YOLO v3算法详解 Atlas 的博客 CSDN博客 y
  • 基于人脸特征点实现疲劳检测

    为了有效监测驾驶员是否疲劳驾驶 避免交通事故的发生 提出了一种利用人脸特征点进行实时疲劳驾驶检测的新方法 对驾驶员驾驶时的面部图像进行实时监控 首先检测人脸 并利用ERT算法定位人脸特征点 然后根据人脸眼睛区域的特征点坐标信息计算眼睛纵横比
  • 基于 HPSocket , 实现 socket 通讯

    HPSocket HP Socket 是一套通用的高性能 TCP UDP HTTP 通信框架 xff0c 包含服务端组件 客户端组件和 Agent 组件 xff0c 广泛适用于各种不同应用场景的 TCP UDP HTTP 通信系统 xff0
  • windows 基于 MediaPipe 实现 PoseTracking

    MediaPipe是用于构建跨平台多模态应用ML管道的框架 xff0c 其包括快速ML推理 xff0c 经典计算机视觉和媒体内容处理 xff08 如视频解码 xff09 在2019年6月举行的CVPR大会 xff0c MeidaPipe正式
  • windows 基于 MediaPipe 实现 HandTracking

    OverView 感知手的形状和运动的能力可能是改善跨各种技术领域和平台的用户体验的重要组成部分 例如 xff0c 它可以构成手语理解和手势控制的基础 xff0c 还可以在增强现实中将数字内容和信息叠加在物理世界之上 虽然对人们来说很自然
  • DeepStream 部署 RTSP + scaled-yolov4 (tensorrtx)

    DeepStream应用程序将深度神经网络和其他复杂的处理任务引入到流处理管道中 xff0c 以实现对视频和其他传感器数据的近实时分析 从这些传感器中提取有意义的见解为提高运营效率和安全性创造了机会 例如 xff0c 摄像头是当前使用最多的
  • DeepStream 多路拉取RTSP视频流

    上一篇介绍DeepStream 如何集成Yolov4模型 xff0c 那么本篇介绍下如何实现读取多路RTSP 代码 主要代码参考 https github com belarbi2733 deepstream rtspsrc yolo详细代
  • 编码格式(关于utf-8,gb2312,gbk,big5等)

    计算机数据是以二进制的方式来存储 xff0c 符号代表文字 那么二进制数据表示的模式就是编码 xff0c 跟电报的加密解密是一个道理 xff0c 那么如何将这些数据转化成有效字符 xff0c 这就涉及到了编码格式 xff0c 一般常见的编码
  • Ubuntu配置桥接网络

    第一步 xff1a 点击虚拟机 xff0c 点击设置 第二步 xff1a 点击网络适配器 xff0c 选中桥接模式并确定 第三步 xff1a 点击编辑 xff0c 打开虚拟网络编辑器 xff0c 选中桥接模式 点击 网络属性 找到描述 xf
  • 基于 NCNN, 实现 yolov8

    记录下 基于 ncnn 实现 yolov8 的全部过程 修改 ultralytics nn modules py class Detect forward 和 class C2f forward span class token keywo
  • HRNet 训练自定义数据集

    基于 HRNet 训练人脸特征点数据集 INSTALL conda create n openmmlab span class token assign left variable python span span class token
  • Chatgpt 指令收集

    在使用 ChatGPT 时 xff0c 当你给的指令越精确 xff0c 它的回答会越到位 xff0c 举例来说 xff0c 假如你要请它帮忙写文案 xff0c 如果没给予指定情境与对象 xff0c 它会不知道该如何回答的更加准确 一 写报告
  • openEuler 安装图形桌面环境Gnome或DDE或UKUI

    由于openEuler系统主要针对服务器 xff0c 目前默认安装之后没有图形桌面环境 xff0c 需要的用户可以自己手动安装配置 这里推荐安装深度桌面DDE或优麒麟UKUI环境 安装gnome桌面 sudo dnf makecache s
  • Ubuntu更换国内镜像源

    由于Ubuntu官方镜像速度有限 xff0c 可以使用国内镜像加速更新和下载 xff0c 节约时间 常用的国内镜像有很多 xff0c 本人常用的有如下几个 xff0c 仅供参考 163镜像 mirrors 163 com 清华镜像 mirr
  • ubuntu-2204 gerrit ssh 报错Permission denied (publickey).分析及解决

    ubuntu 2204 gerrit ssh 报错Permission denied publickey 分析及解决 使用repo init sync下载代码时遇到报错 Permission denied publickey 分析排查步骤
  • 消息序列化工具-protobuf介绍及安装使用技巧

    简介 protobuf是google团队开发的用于高效存储和读取结构化数据的工具 xml json也可以用来存储此类结构化数据 xff0c 但是使用protobuf表示的数据能更加高效 xff0c 并且将数据压缩得更小 xff0c 大约是j
  • 消息序列化工具-为现代C++设计的jsoncpp介绍与使用技巧

    概述 JSON 的全称为 xff1a JavaScript Object Notation xff0c 顾名思义 xff0c JSON 是用于标记 Javascript 对象的 xff0c JSON 官方的解释为 xff1a JSON 是一
  • cppcheck代码检查工具安装与使用技巧

    cppcheck代码检查工具安装与使用技巧 Cppcheck 是一种 C C 43 43 代码缺陷静态检查工具 不同于 C C 43 43 编译器及很多其它分析工具 xff0c 它不检查代码中的语法错误 Cppcheck 可以检查非标准代码