INCONSISTENT.LABEL
case ラベルが矛盾しています
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;
}
}
Klocwork は、foo1() について、switch で使用される変数の型が case のラベルの型と異なっていることを示す 8 行目にフラグを立てます。Klocwork は、foo2() について、case のラベルが 2 つの異なる列挙型からの列挙子を使用していることを示す 16 行目にフラグを立てます。