C33010

警告 C33010: インデックスとして使用される列挙型 'enum' の下限は確認されていません。

この警告は、配列へのインデックスとして使用される列挙型に対して、上限の値が検査されているが、下限が検査されていない場合にトリガーされます。

配列のインデックスとして列挙型を使用するコードでは、多くの場合、インデックスが範囲外でないことを確認するために上限が検査されます。 既定で列挙型変数は符号付きなので、負の値の可能性があります。 列挙型が値の配列または関数ポインターの配列へのインデックスとして使用される際には、負の値の場合、任意のメモリを読み取ったり、使用したり、さらには実行したりできる可能性があります。

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

関連項目

C33011