インデックスとして使用される列挙型 'enum' の未チェックの上限。
解説
この警告は、配列のインデックスとして使用される列挙型に対して、下限の値が検査されているが、上限が検査されていない場合にトリガーされます。
コード分析名: UNCHECKED_UPPER_BOUND_FOR_ENUMINDEX
例
配列のインデックスとして列挙型を使用するコードでは、下限と上限の両方の列挙値をチェックする必要があります。 列挙値が、値の配列 (または関数ポインターの配列) にインデックスを作成する前に下限のみをチェックする場合は、任意のメモリの読み取り、使用、または実行を許可できます。
typedef void (*PFN)();
enum class Index
{
Zero,
One,
Two,
Three,
Max
};
void foo(Index idx, PFN(&functions)[5])
{
if (idx < Index::Zero)
return;
auto pfn = functions[static_cast<int>(idx)]; // C33011
if (pfn != nullptr)
(*pfn)();
// ......
}
次のように、インデックス値の上限も検査すると、これらの警告は修正されます。
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)]; // OK
if (pfn != nullptr)
(*pfn)();
// ......
}