UNREACH.ENUM

到達不能コード

列挙型が取りうる値が原因で、コードは到達不能になっています

UNREACH.ENUM チェッカーは、列挙値の条件によって保護されているために、決して実行されないコードを探します。そのような値は実現できない可能性があります。これは、強い型指定の列挙の場合に実際に現れます。C スタイルの列挙型は整数として表されており、ガベージ値が割り当てられている必要があります。以下の例では、3 番目の分岐が実行される可能性があります。

強い型指定の列挙に到達不能コードがあると想定される場合は、UNREACH.ENUM チェッカーを有効にすることができます。ガベージ値を保持していると想定される C スタイルの列挙型をコードが使用しており、条件でその値を意図的に使用する場合は、UNREACH.ENUM チェッカーを無効にすることができます。UNREACH.GEN チェッカーにより、到達不能コードのより一般的なケースを引き続きチェックできます。

脆弱性とリスク

列挙値の条件が原因である到達不能コードは、コードのメンテナンスやコードレビュー中に混乱を招く可能性があります。

脆弱コード例

コピー
  enum class E {
      E1, E2
  };
  
  void f1();
  void f2();
  void f3();
  
  void foo(E e)
 {
     if (e == E::E1) {
         f1();
     } else if (e == E::E2) {
         f2();
     } else {
         f3();
     }
 }

この場合、Klocwork は UNREACH.ENUM の指摘を報告し、f3() の呼び出しが決して実行されない場合があることを示します。上記の条件付きステートメントで強い型指定の列挙を使用すると、else 分岐は到達不能としてマークされます。これは、強い型指定の世界では、列挙型のオブジェクトは特定の離散値 (E1 または E2) しか保持できないためです。現実世界のコードでは、列挙型は整数として表されており、列挙型にガベージ値が割り当てられている場合は、3 番目の分岐を実行できます。

関連チェッカー