cppcheck 的 memsetClass 检查器:如何在 C++ 中检测对非 POD 类使用 memset/memcpy 的未定义行为
开发工具静态分析代码质量质量保障【免费下载链接】cppcheckstatic analysis of C/C code项目地址https://gitcode.com/gh_mirrors/cpp/cppcheck点击查看免费下载导读在 C 中对包含std::string、std::vector、虚函数等非平凡成员的类型使用memset()、memcpy()或memmove()会绕过构造函数、析构函数与拷贝语义直接按字节覆写对象内部状态属于未定义行为。cppcheck 提供的memsetClass检查器专门识别这类隐患并在默认配置下以Error错误级别报告。本文以 cppcheck 仓库中的 memsetClass 检查器文档 为主线结合 checkclass.cpp 源码与 testclass.cpp 测试用例讲解该检查器的触发条件、检测原理、修复方案及其三个变体memsetClassReference、memsetClassFloat、mallocOnClassError的差异帮助读者在实际项目中快速定位并修复此类未定义行为。检查器速览memsetClass的核心元信息见 man/checkers/memsetClass.md如下项目值MessageUsing memset on class that contains a std::string.CategoryUndefined Behaviour未定义行为SeverityError错误LanguageC从源码角度看该报告对应 CWE 编号CWE-762Mismatched Memory Management Routines内存管理例程不匹配见 checkclass.cpp 第 48 行 的 CWE 定义与 第 1642 行 的reportError调用上报确定性为Certainty::normal。为什么要禁止对非 POD 类型使用 memset原始内存函数memset等对 C 对象语义一无所知——它们只负责把一段内存按字节覆写为指定值。而std::string内部维护着指针/长度等簿记信息heap 指针、size、capacity其构造、析构和拷贝都需要执行特定的代码逻辑来维持自身不变量。当用memset(fred, 0, sizeof(Fred))这类调用覆写整个对象时构造函数被绕过对象从未被正确初始化成员处于半构造状态析构函数被绕过std::string原本在析构时释放的堆内存将泄漏拷贝/赋值语义被绕过引用计数、指针管理等内部机制全部失效对象状态被破坏把 string 内部的指针清零后后续任何访问该成员的操作析构、赋值、比较都会触发崩溃或内存损坏。这正是 cppcheck 将其归类为Undefined Behaviour的原因对象被按字节抹零后其生命周期语义已完全被破坏。触发场景与检测原理检测入口该检查由CheckClassImpl::checkMemset()实现checkclass.cpp 第 1450 行逐一遍历符号数据库中的函数作用域匹配形如memset|memcpy|memmove (的调用第 1456 行因此三个函数都会被检测到。如何判定对象类型判定逻辑集中在checkMemsetType()第 1546 行主要途径包括从sizeof()参数推导类型当第三个参数是sizeof(Fred)、sizeof(n1::Fred)、sizeof(struct X)等形式时直接从 sizeof 表达式提取类型第 1468-1480 行从对象表达式推导类型第一个参数为fred、fred、*ptr等时通过变量符号解析其类型作用域第 1483-1509 行成员函数内this识别memset(this, 0, sizeof(*this))模式通过findFunctionOf()找到所属类第 1440-1448 行、第 1481-1482 行。触发条件清单checkMemsetType()对目标类型递归检查基类第 1556-1560 行并遍历成员变量第 1573 行满足以下任一条件即报错含有非静态、非 const 的 STL 类型成员std::string、std::vector等排除std::array以及被库配置标记为 POD 的类型第 1594 行含有虚函数virtual关键字如虚析构函数因为虚表指针会被覆写第 1563-1569 行含有引用成员走memsetClassReference变体见下文含有浮点成员走memsetClassFloat变体仅对memset见下文。同时存在豁免规则测试用例 testclass.cpp 第 3055-3064 行 验证空类无成员不会报错成员为指针类型如std::string * b;不会报错——指针本身是 POD不会破坏对象语义静态成员、const 成员、数组元素为指针的成员会被跳过第 1578-1579 行。复现与验证最小示例原文档给出的Before示例就是最直接的复现man/checkers/memsetClass.md#include cstring #include string class Fred { public: std::string b; }; void f() { Fred fred; memset(fred, 0, sizeof(Fred)); // - memsetClass: bypasses std::strings own management }cppcheck 对这段代码的输出为[test.cpp:8:5]: (error) Using memset on class that contains a std::string. [memsetClass]这与测试套件 testclass.cpp 第 3075 行 中checkNoMemset用例断言的输出完全一致。同类场景还有在成员函数内memset(this, 0, sizeof(*this))测试 3088-3095 行通过基类继承获得非 POD 成员class Pebbles : public Fred {};测试 3118-3128 行命名空间限定类型n1::Fred测试 3182-3193 行含虚析构函数的类测试 3130-3139 行同一std::vector结构体上多处 memset 各报一次测试 3268-3273 行。命令行验证方式在已构建 cppcheck 的机器上可直接对示例文件运行默认即启用 error 级别cppcheck --enableall --languagec --stdc11 test.cpp也可单独指定该检查器相关的 iderror 级别默认开启无需额外开关。如何修复原文档给出的After示例体现了修复的核心思路直接用对象语义完成清零需求——依靠构造函数创建已初始化的Fred对象而不是用字节覆写#include string class Fred { public: std::string b; }; void f() { Fred fred; }针对不同场景的推荐修复方式场景推荐做法需要重置一个对象为初始状态使用赋值fred Fred();或fred {};走拷贝/移动语义需要清空容器使用str.clear()、vec.clear()等成员函数需要重新初始化在对象作用域内重新构造或使用placement new需配合显式析构调用仅清零 POD 部分只对std::memset于 POD 子对象/数组成员不覆盖非 POD 成员三个关联变体同源问题的不同侧面原文档末尾列出的两个关联检查器与主检查器共享相同的底层失误用字节覆写破坏类型不变量但针对不同的成员类型、使用不同的严重级别与 CWEmemsetClassReference含引用成员的类报告 idmemsetClassReferenceSeverity 为Errorcheckclass.cpp 第 1645-1650 行对应 CWE-665Improper Initialization不正确的初始化触发路径成员变量isReference() !isStatic()第 1574-1576 行消息形如Using memset on class that contains a reference.文档见 man/checkers/memsetClassReference.md。memsetClassFloat含浮点成员的类报告 idmemsetClassFloatSeverity 为Portability可移植性checkclass.cpp 第 1652-1658 行对应 CWE-758Reliance on Undefined, Unspecified, or Implementation-Defined Behavior依赖未定义/未指定/实现定义行为仅对memset触发memcpy/memmove不在其列第 1606 行原因是浮点数的内存表示是实现定义的全字节置零在 IEEE-754 兼容实现上恰好等于0.0但不可移植文档见 man/checkers/memsetClassFloat.md。关联mallocOnClassError / mallocOnClassWarning同一源码函数还处理为类实例分配内存的相关场景checkMemsetType的allocation参数为 true 时的分支mallocOnClassErrorCWE-665malloc分配的内存未调用构造函数第 1622-1631 行报告中提示Consider using new insteadmallocOnClassWarningwarning 级别需--enablewarning类提供构造函数但仍使用malloc第 1612-1620 行。三者的完整报告消息均可在 checkclass.cpp 第 1633-1658 行 中查看其中的$symbol:占位符会在输出时替换为实际的函数名、类型名等信息。测试覆盖与边界行为memsetClass的测试集中在 test/testclass.cpp 的checkNoMemset系列用例中覆盖了相当全面的边界情况类型识别方式多样sizeof(Fred)、sizeof(fred)通过变量、sizeof(n1::Fred)命名空间限定、sizeof(*this)成员函数内成员形态差异std::string、std::vector、mutable成员测试 3077-3086 行均会触发豁免路径空类、指针成员、数组指针成员不触发测试 3097-3105 行继承与虚函数多级继承中任一基类含非 POD 成员或虚函数都会触发测试 3152-3165 行静态存储期对象对static Fred fred;同样触发测试 3141-3150 行跨文件/未知类型类定义不在当前翻译单元时cppcheck 会依据符号数据库尽量解析解析失败时可能漏报属于静态分析工具的固有局限。在项目中落地建议持续集成接入把memsetClass当作 Error 级缺陷对待在 CI 中配置cppcheck --enablewarning,style --error-exitcode1使此类问题直接阻断构建配合库配置检测逻辑会参考library.podtype()checkclass.cpp 第 1594 行——若你的自定义类型本质是 POD可在项目自定义.cfg库文件中标记避免误报同时std::array已内置豁免因为它不具备堆指针等资源管理语义代码评审要点看到memset(obj, ...)/memcpy(obj, ...)/memmove(obj, ...)时先确认对象类型是否为 POD非 POD 一律改用构造、赋值或成员函数实现善用变体检查器memsetClassReference、memsetClassFloat与memsetClass一并默认启用覆盖了引用与浮点两种更隐蔽的场景。小结memsetClass是 cppcheck 针对原始内存操作破坏 C 对象语义这一未定义行为提供的高置信度静态检测。它覆盖memset/memcpy/memmove三种函数、继承与命名空间等多种对象形态并延伸出memsetClassReference引用成员与memsetClassFloat浮点成员两个变体配合测试套件 testclass.cpp 中的大量用例可以可靠地在编译前拦截这类会导致内存损坏、资源泄漏与不可移植行为的经典 C 语言惯性写法。赞分享开发工具静态分析代码质量质量保障【免费下载链接】cppcheckstatic analysis of C/C code项目地址https://gitcode.com/gh_mirrors/cpp/cppcheck点击查看免费下载相关推荐微信聊天记录怎么完整导出WeChatMsg 免费教程Word/HTML/CSV 与年度报告一次搞定微信聊天记录怎么完整导出WeChatMsg 免费教程Word/HTML/CSV 与年度报告一次搞定 WeChatMsg项目名留痕是基于 MIT 协议开发工具静态分析代码质量质量保障cppcheck returnReference 检查器详解C 返回局部变量引用的未定义行为检测cppcheck returnReference 检查器详解C 返回局部变量引用的未定义行为检测 导读 returnReference 是 cppchec开发工具静态分析代码质量质量保障cppcheck incompleteArrayFill 检查器深度解析识别 memset/memcpy/memmove 字节数误用cppcheck incompleteArrayFill 检查器深度解析识别 memset/memcpy/memmove 字节数误用 导读 本文围绕 cppc开发工具静态分析代码质量质量保障上一篇突破实时监控瓶颈RTSP Simple Server实现RPi相机微秒级时间戳叠加全指南下一篇3分钟上手Text-Generation-Inference本地化部署全攻略NVIDIA/AMD通用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

轻虾导出助手使用指南:从原理到实操,一次看懂微信聊天记录导出

轻虾导出助手使用指南:从原理到实操,一次看懂微信聊天记录导出

前言微信聊天记录导出,很多人第一次接触时,脑子里是乱的:记录到底存哪?为什么说删了就没了?工具能做什么、不能做什么?四种格式(HTML/PDF/Excel/TXT)到底怎么选?导出完怎…

2026/10/5 1:46:19 阅读更多 →
从 Refundid 档案解析 remoteintech.company:远程友好科技公司目录的公司档案结构与混合远程 fintech 案例

从 Refundid 档案解析 remoteintech.company:远程友好科技公司目录的公司档案结构与混合远程 fintech 案例

数据集 【免费下载链接】remote-jobs Source for remoteintech.company — a community-maintained directory of remote-friendly tech companies 项目地址: https://gitcode.com/GitHub_Trending/re/remote-jobs 点击查看 免费下载 Refundid 是 remoteintech.com…

2026/10/5 1:46:19 阅读更多 →
终极游戏存档守护指南:用Ludusavi让游戏进度永不丢失

终极游戏存档守护指南:用Ludusavi让游戏进度永不丢失

终极游戏存档守护指南:用Ludusavi让游戏进度永不丢失 【免费下载链接】ludusavi Backup tool for PC game saves 项目地址: https://gitcode.com/GitHub_Trending/lu/ludusavi 作为一名游戏玩家,你是否曾因电脑重装、游戏崩溃或存档损坏而失去宝贵…

2026/10/5 1:45:19 阅读更多 →

最新新闻

Colmap中PatchMatch源码实战:从编译报错到深度图调优

Colmap中PatchMatch源码实战:从编译报错到深度图调优

1. 这不是“看懂就行”的源码阅读,而是要让PatchMatch在Colmap里真正跑起来如果你搜“Colmap中 patchmatch源码”,大概率正卡在某个具体环节:编译报错说找不到patch_match_stereo.h、调试时发现PatchMatch::ComputeCostVolume函数里cost volu…

2026/10/5 4:25:30 阅读更多 →
EEG睡眠分期CNN实战:从预处理到Grad-CAM可解释性

EEG睡眠分期CNN实战:从预处理到Grad-CAM可解释性

简介:本资源是一份面向本科生毕业设计与人工智能课程实践的深度学习睡眠状态检测项目,聚焦EEG脑电信号分类任务,解决睡眠阶段自动识别这一典型生物医学信号分析问题。压缩包共3个文件,含2个核心Python脚本(cnn-eeg-cla…

2026/10/5 4:25:30 阅读更多 →
从零构建个人知识库问答机器人:RAG技术选型与工程实践全解析

从零构建个人知识库问答机器人:RAG技术选型与工程实践全解析

个人知识库问答机器人这个方向,我从去年开始断断续续折腾了好几轮,从最初用现成框架拼凑,到后来自己拆开每一层重新实现,踩过的坑比想象中多得多。很多人以为搭一个"能回答我文档问题"的机器人就是调个API的事&#xff…

2026/10/5 4:25:30 阅读更多 →
DeepSeek Harness桌面端完整指南:从API Key配置到插件与Skill内网部署

DeepSeek Harness桌面端完整指南:从API Key配置到插件与Skill内网部署

1. 桌面端来了,为什么这件事比想象中重要DeepSeek Harness 出官方桌面端这件事,我第一反应不是"终于等到了",而是"早该这么干了"。过去大半年,我身边用 DSH 的人基本分成两派:一派死磕命令行&…

2026/10/5 4:25:30 阅读更多 →
DeepSeek Harness 桌面端安装配置与插件Skill部署全指南

DeepSeek Harness 桌面端安装配置与插件Skill部署全指南

1. 桌面端来了,为什么这件事比想象中重要DeepSeek Harness 出官方桌面端这件事,我第一反应不是“终于不用开浏览器了”,而是“这套工作流终于能脱离浏览器标签页活下去了”。如果你之前用过 DSH(也就是 DeepSeek Harness 的社区简…

2026/10/5 4:25:30 阅读更多 →
深度学习实现蛋白质亚细胞定位预测:从数据清洗到模型部署全指南

深度学习实现蛋白质亚细胞定位预测:从数据清洗到模型部署全指南

简介:《基于深度学习的蛋白质亚细胞定位预测》是一篇发表在《计算机应用》期刊上的学术论文,面向生物信息学研究者与深度学习算法学习者,围绕蛋白质亚细胞定位预测问题,提出基于堆栈式降噪自编码器(SDAE)的…

2026/10/5 4:23:26 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →