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 行目にフラグを立てます。