INCONSISTENT.LABEL

案例标签不一致

INCONSISTENT.LABEL 检查器发现多个枚举类型用作一个 switch 表达式,或者用作 switch 语句中的一个标签的情况。

漏洞与风险

在一个 switch 语句中使用多个具有不同枚举类型的标签,可能会引发问题,因为具有相同值的枚举成员可能具有不同的含义。进而导致达不到设计目标,并且可能会发生意想不到的结果。

漏洞代码示例

复制
  typedef enum Q1{Q1Send, Q1Recv} Q1;
  typedef enum Q2{Q2None, Q2Send, Q2Recv} Q2;
  
  // Inconsistency between switch variable and case labels
  void foo1(Q1 q) {
    switch (q) {
      case Q2Send: f(); break;
      case Q2Recv: g(); break;
    }
 }
 
 //Inconsistency between case labels
 void foo2(Q1 q) {
   switch (q) {
     case Q1Send: f(); break;
     case Q2Recv: g(); break;
   }
 }

针对 foo1(),Klocwork 标记了第 8 行,指出在 switch 中使用的变量类型与用例标签类型不同。针对 foo2(),Klocwork 标记了第 16 行,指出用例标签使用两个不同枚举类型中的枚举器。