警告 C33010

インデックスとして使用される列挙型 'enum' の未チェックの下限。

この警告は、列挙型が両方とも配列のインデックスとして使用され、下限でチェックされていない場合にトリガーされます。

解説

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

コード分析名: UNCHECKED_LOWER_BOUND_FOR_ENUMINDEX

この警告が発生するコード例を次に示します。 idxfunctionsにアクセスするためのインデックスとして使用されますが、下限はチェックされません。

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)];
    if (pfn != nullptr)
        (*pfn)();
}

次のコードでは、下限をチェックしてこの警告を修復し、 idx が負ではないことを確認します。

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)];
    if (pfn != nullptr)
        (*pfn)();
}

または、署名されていない Index の基になる型を選択して、問題を修正することもできます。 符号なし値は常に正であるため、上限のみをチェックするだけで十分です。

typedef void (*PFN)();

enum class Index : unsigned int
{
    Zero,
    One,
    Two,
    Three,
    Max
};

void foo(Index idx, PFN(&functions)[5])
{
    if (idx > Index::Max)
        return;

    auto pfn = functions[static_cast<unsigned int>(idx)];
    if (pfn != nullptr)
        (*pfn)();
}

関連項目

C33011