UNREACH.ENUM
无法访问的代码
由于枚举的可能值而无法访问代码。
UNREACH.ENUM 检查器会查找永远不会被执行的代码,因为该类代码由枚举值上的条件保护,此类值可能在其中无法实现。强类型枚举就是如此。假如 C 样式枚举被赋了垃圾值,该枚举会被表示为整型。在以下示例中,可以执行第三个分支。
当您预期强类型枚举会有无法访问的代码时,可以启用 UNREACH.ENUM 检查器。当代码使用可以预期容纳垃圾值的 C 样式枚举,并且您特意要在条件中使用该值时,可以禁用 UNREACH.ENUM 检查器。您仍然可以通过 UNREACH.GEN 检查器来检查无法访问的代码更一般的情况。
漏洞与风险
因枚举值上的条件而导致的不可访问代码,可能会在代码维护和/或代码评审时引起混淆。
漏洞代码示例
复制
enum class E {
E1, E2
};
void f1();
void f2();
void f3();
void foo(E e)
{
if (e == E::E1) {
f1();
} else if (e == E::E2) {
f2();
} else {
f3();
}
}
在本例中,Klocwork 报告 UNREACH.ENUM 问题,表明可能永远不会执行对 f3() 的调用。在以上条件语句中使用强类型枚举时,else 分支被标记为无法访问,这是因为在强类型环境中,枚举类型的对象只可能具有某些离散值(E1 或 E2)。在现实世界代码中,枚举会被表示为整型,并且如果枚举被赋了垃圾值,那么可以执行第三个分支。