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)();
    // ......
}

関連項目

C33010