インデックスとして使用される列挙型 'enum' の未チェックの下限。
この警告は、列挙型が両方とも配列のインデックスとして使用され、下限でチェックされていない場合にトリガーされます。
解説
配列のインデックスとして列挙型を使用するコードでは、インデックスが範囲外でないことを確認するために、多くの場合、上限がチェックされます。 既定で列挙型変数は符号付きなので、負の値の可能性があります。 負の配列インデックスを使用すると、任意のメモリを読み取り、使用、または実行することができます。
コード分析名: UNCHECKED_LOWER_BOUND_FOR_ENUMINDEX
例
この警告が発生するコード例を次に示します。 idx は functionsにアクセスするためのインデックスとして使用されますが、下限はチェックされません。
typedef void (*PFN)();
enum class Index
{
Zero,
One,
Two,
Three,
Max
};
void foo(Index idx, PFN(&functions)[5])
{
if (idx > Index::Max)
return;
auto pfn = functions[static_cast<int>(idx)];
if (pfn != nullptr)
(*pfn)();
}
次のコードでは、下限をチェックしてこの警告を修復し、 idx が負ではないことを確認します。
typedef void (*PFN)();
enum class Index
{
Zero,
One,
Two,
Three,
Max
};
void foo(Index idx, PFN(&functions)[5])
{
if (idx < Index::Zero || idx > Index::Max)
return;
auto pfn = functions[static_cast<int>(idx)];
if (pfn != nullptr)
(*pfn)();
}
または、署名されていない Index の基になる型を選択して、問題を修正することもできます。 符号なし値は常に正であるため、上限のみをチェックするだけで十分です。
typedef void (*PFN)();
enum class Index : unsigned int
{
Zero,
One,
Two,
Three,
Max
};
void foo(Index idx, PFN(&functions)[5])
{
if (idx > Index::Max)
return;
auto pfn = functions[static_cast<unsigned int>(idx)];
if (pfn != nullptr)
(*pfn)();
}