C33011
警告 C33011: インデックスとして使用される列挙型 'enum' の上限は確認されていません。
この警告は、配列のインデックスとして使用される列挙型に対して、下限の値が検査されているが、上限が検査されていない場合にトリガーされます。
例
配列のインデックスとして列挙型を使用するコードでは、下限と上限の両方の列挙値をチェックする必要があります。 値の配列または関数ポインターの配列にインデックスを作成する前に、列挙値が下限に対してのみチェックされる場合、任意のメモリの読み取り、使用、または実行を許可することができます。
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)();
// ......
}