遗漏分支通常出现在多条件组合或枚举状态处理中,不是语法错误,编译器不报错,但会导致某些输入下逻辑跳过、返回默认值或未定义行为;最典型的是switch缺少default,或if-else if链漏掉某个合法取值范围。

遗漏分支通常出现在多条件组合或枚举状态处理中
条件分支遗漏不是语法错误,编译器不会报错,但会导致某些输入下逻辑跳过、返回默认值、甚至未定义行为。最典型的是 switch 缺少 default,或 if-else if 链漏掉某个合法取值范围(比如只判了 > 0 和 ,却忘了 <code>== 0)。
用枚举 + switch 强制覆盖所有 case
对有限且已知的状态集合,优先用 enum class 配合 switch,再加编译期检查:
- GCC/Clang 下开启
-Wswitch-enum或-Wcovered-switch-default,未处理的枚举值会触发警告 - MSVC 对应选项是
/we4062(未处理枚举项视为错误) - 即使写了
default,也建议在其中加assert(false)或std::unreachable()(C++23),防止未来新增枚举项时被静默吞掉
测试用例必须覆盖“边界+意外值”
光测几个典型值远远不够。遗漏常藏在边界和隐含假设里:
- 对整数条件:除了正数、负数,一定要测
0、INT_MIN、INT_MAX - 对字符串或指针判断:空字符串
""、nullptr、含控制字符的串 - 对浮点数:直接用
==判断极易遗漏,应改用区间判断或std::isnan/std::isinf显式处理 - 如果分支依赖外部输入(如配置文件、网络响应),测试时要伪造所有可能的原始值,而非只测解析后的结果
静态分析和覆盖率工具能暴露沉默的遗漏
运行时测试再全也难保 100% 路径覆盖。真正管用的是把“没走过的分支”变成可见信号:
立即学习“C++免费学习笔记(深入)”;
- 用
gcov+lcov生成分支覆盖率报告,重点关注标红的未执行else块或switch分支 - Clang 的
-fsanitize=undefined在某些未定义分支跳转时会直接 abort,比静默跳过更早暴露问题 - 注意:
if constexpr是编译期分支,它不参与运行时覆盖率统计——这类遗漏得靠模板实例化测试或编译警告(如-Wunreachable-code)来发现
最危险的遗漏不是写错了分支,而是压根没意识到还有第三种状态存在。写测试前先白板列出所有可能输入域,再逐条打钩,比盲目补用例有效得多。


















