EN JP CN

INCONSISTENT.LABEL

INCONSISTENT.LABEL

case ラベルが矛盾しています

INCONSISTENT.LABEL チェッカーは、複数の列挙型が switch 式として、または switch ステートメントのラベルとして使用される状況を検出します。

脆弱性とリスク

switch ステートメントで異なる列挙型のラベルを使用すると、問題が起こる可能性があります。その理由は、列挙メンバーが、同じ値を異なる意味で持つ可能性があるためです。設計の意図が失敗し、予期しない結果が発生する可能性があります。

脆弱コード例

1  typedef enum Q1{Q1Send, Q1Recv} Q1;
2  typedef enum Q2{Q2None, Q2Send, Q2Recv} Q2;
3  
4  // Inconsistency between switch variable and case labels
5  void foo1(Q1 q) {
6    switch (q) {
7      case Q2Send: f(); break;
8      case Q2Recv: g(); break;
9    }
10 }
11 
12 //Inconsistency between case labels
13 void foo2(Q1 q) {
14   switch (q) {
15     case Q1Send: f(); break;
16     case Q2Recv: g(); break;
17   }
18 }

Klocwork foo1() について、switch で使用される変数の型が case のラベルの型と異なっていることを示す 8 行目にフラグを立てます。Klocworkfoo2() について、case のラベルが 2 つの異なる列挙型からの列挙子を使用していることを示す 16 行目にフラグを立てます。