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 行,指出用例标签使用两个不同枚举类型中的枚举器。