警告 C33011

インデックスとして使用される列挙型 '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)();
    // ......
}

関連項目

C33010