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 番目の分岐を実行できます。