
开发工具静态分析代码质量质量保障【免费下载链接】cppcheckstatic analysis of C/C code项目地址https://gitcode.com/gh_mirrors/cpp/cppcheck点击查看免费下载本篇文章围绕 cppcheck 的integerOverflow/integerOverflowCond检查项展开讲解它如何基于平台整型宽度识别有符号整型算术表达式的上溢与下溢、其底层实现原理、误报规避策略以及修复方法。读完本文你将掌握该检查项的报告条件、源码级判定逻辑并能针对真实项目中的溢出告警给出正确修复方案。检查项概览Message: Signed integer overflow for expression x*y.Category: Undefined Behaviour未定义行为Severity: Error / WarningLanguage: C/C该检查项由 lib/checktype.cpp 中的CheckTypeImpl::checkIntegerOverflow()实现负责检测有符号整型算术表达式、-、*、/、等是否会超出其结果类型所能表示的范围产生溢出overflow或下溢underflow。判定依据是当前平台配置的整型宽度int、long、long long的位数并非笼统地按 32 位或 64 位假设。检查项 ID 映射关系记录在 lib/checkersidmapping.cpp旧版检查器 IDINT32被映射到integerOverflow因此历史告警与抑制规则中的INT32仍能继续生效。两种告警变体integerOverflow 与 integerOverflowCond按溢出的确定性程度该检查项分为两种告警 IDID触发条件示例消息integerOverflow溢出/下溢是无条件的——对 cppcheck 能观察到的到达该点的每一个值都会发生Signed integer overflow for expression intmax1integerOverflowCond溢出/下溢仅在代码中某处条件成立时发生Either the condition x123456 is redundant or there is signed integer overflow for expression x*x两种变体的 ID 选择逻辑位于getMessageId()lib/checktype.cpp当 ValueFlow 推导出的溢出值带有condition即该值依赖某个条件分支时ID 追加Cond后缀若该值来自安全检查safe路径则加上safe前缀对应safeIntegerOverflow家族。integerOverflowCond的消息措辞也体现了其语义既然溢出只有在条件成立时才可能发生那么要么该条件本身是冗余的条件为真时才会溢出的路径实际不可达要么确实存在条件性溢出——两条路径必居其一。为什么值得重视有符号溢出的危害有符号整型溢出在 C 和 C 标准中是未定义行为UB。实践中它通常意味着计算静默产生错误结果回绕或截断而在开启优化时编译器被允许假设溢出永远不会发生从而以令人惊讶的方式消除或重排代码。例如INT32_MAX 1在理论上本应回绕成-2147483648但优化编译器可能直接将其当作不可达路径处理导致行为不可预测。检测器为这类问题分配 CWE-190整数溢出见 lib/checktype.cpp。源码级判定逻辑checkIntegerOverflow()的核心流程lib/checktype.cpp可以概括为以下步骤平台前置校验若平台类型为Unspecified未指定或平台int位宽不小于内部大整数位数MathLib::bigint_bits则直接返回无法运行该检查器——因为缺少可信的整型宽度信息。遍历算术运算符扫描所有 token仅关注isArithmeticalOp()命中的运算符节点。确认结果类型运算符的结果必须是有符号整型ValueType::sign SIGNED无符号结果天然回绕不在此检查范围内。读取平台位宽根据结果类型为int/long/long long分别取平台配置的int_bit、long_bit、long_long_bit来自Platform配置可通过--platform指定。计算边界并取溢出值maxvalue (1 (bits - 1)) - 1即该类型最大值通过getValueGE(maxvalue 1)检测上溢结果 ≥ 最大值 1若未命中再通过getValueLE(-maxvalue - 2)检测下溢结果 ≤ 最小值 - 1。特殊放行左移对运算若结果值落在(0, 2^bits)区间即左移进入了符号位如 32 位int下的1 31不报告。这是刻意为之——左移进符号位虽在标准上是未定义行为但属于业界通行写法改由 shiftTooManyBits 检查族 负责。上报调用integerOverflowError()根据ValueFlow::Value的condition、safe标志组装消息并按value.errorSeverity()决定Severity::error还是Severity::warninglib/checktype.cpp。何时不会报告文档特别强调cppcheck 只在确实能证明计算会溢出时才告警。判断依据要么是已知常量值要么是代码中某处条件对应integerOverflowCond。对于两个完全不受约束的参数的普通a * bValueFlow 拿不到任何可证明溢出的取值区间因此不会报告。这一点也在测试中得到印证return intmax - 1;已知不溢出不产生任何告警见 test/testtype.cpp。测试用例验证test/testtype.cpp 中的checkIntegerOverflow测试用例完整覆盖了各类场景可作为理解该检查项行为的手册输入代码期望输出x (int)0x10000 * (int)0x10000;(error) ... [integerOverflow]32 位平台x (long)0x10000 * (long)0x10000;(error) ... [integerOverflow]32 位平台intmax 0x7fffffff; return intmax 1;(error) Signed integer overflow ... intmax1intmax 0x7fffffff; return intmax - 1;无告警未溢出if (x123456) {} return x * x;(warning) Either the condition x123456 is redundant or there is signed integer overflow ... [integerOverflowCond]if (x123456) {} return -123456 * x;(warning) ... signed integer underflow ... [integerOverflowCond]if (x123456) {} return 123456U * x;无告警结果为无符号循环中n n * 47163 - 57412;#13092两处均报(error) Signed integer underflow(i 31) ? 1 i : 0#12117报告shiftTooManyBitsSigned而非 integerOverflow注意测试均显式指定了Platform::Type::Unix32证明位宽假设确实来自平台配置同一段代码在 32 位平台会溢出在 64 位平台可能不会检测结果随--platform变化。修复方法对integerOverflow/integerOverflowCond告警文档给出三种修复思路改用更宽的类型参与计算——在运算前先扩展类型避免在窄类型中溢出重写计算逻辑以避免溢出——例如乘法前先做边界检查if (a INT32_MAX / b) ...如回绕行为正是意图所在改用无符号类型——无符号算术按标准定义回绕可消除未定义行为。修复前后示例来自 integerOverflow.mdBefore已知会溢出 32 位 intint32_t f() { int32_t intmax 0x7fffffff; // INT32_MAX return intmax 1; // - integerOverflow确定溢出 32 位 int }After先扩宽再相加int64_t f() { int32_t intmax 0x7fffffff; return (int64_t)intmax 1; // - 加法前先扩宽 }第二例正是测试套件中(int)0x10000 * (int)0x10000报integerOverflow、而(long)0x10000 * (long)0x10000同样报错的同款场景——强制转换先行使中间结果落入更宽类型是消除溢出告警最直接的手段。关联检查器与使用提示shiftTooManyBits左移进符号位如 32 位int的1 31被刻意排除在 integerOverflow 之外由 shiftTooManyBits 检查族覆盖checkIntegerOverflow()内部的放行逻辑见 lib/checktype.cpp。平台依赖该检查依赖--platform或 GUI 中的平台设置提供的整型宽度平台未指定Unspecified时检查器直接跳过见 lib/checktype.cpp。在默认平台下运行结果可能与预期不符建议显式指定目标平台后再评估告警。符号性前提只有结果为有符号整型的表达式才会被检查无符号运算如测试中的123456U * x永不触发本检查。其余同属未定义行为类别的整型相关检查还包括浮点到整型转换溢出checkFloatToIntegerOverflowlib/checktype.cpp 起可在同一 checktype.cpp 文件中继续阅读。赞分享开发工具静态分析代码质量质量保障【免费下载链接】cppcheckstatic analysis of C/C code项目地址https://gitcode.com/gh_mirrors/cpp/cppcheck点击查看免费下载相关推荐cppcheck floatConversionOverflow 检查器详解浮点转整数的未定义行为检测cppcheck floatConversionOverflow 检查器详解浮点转整数的未定义行为检测 导读 本文深入讲解 cppcheck 的 floatC开发工具静态分析代码质量质量保障Cppcheck algorithmOutOfBounds 检查器详解STL 算法输出区间越界的静态检测原理与实战Cppcheck algorithmOutOfBounds 检查器详解STL 算法输出区间越界的静态检测原理与实战 导读 本文以 cppcheck 仓库中的检开发工具静态分析代码质量质量保障cppcheck 检查器详解funcArgNamesDifferent / funcArgNamesDifferentUnnamed——函数声明与定义参数名不一致检测cppcheck 检查器详解funcArgNamesDifferent / funcArgNamesDifferentUnnamed——函数声明与定义参数名不开发工具静态分析代码质量质量保障上一篇PromptForge开发者指南如何扩展自定义AI模型集成与插件开发下一篇Video Station在DSM 7.2.2系统的完整部署指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考