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)。在现实世界代码中,枚举会被表示为整型,并且如果枚举被赋了垃圾值,那么可以执行第三个分支。