共用方式為


警告 C33010

用於做為索引之列舉 'enum' 的未核取下限。

如果列舉同時做為陣列中的索引,且未在下限上檢查,就會觸發此警告。

備註

使用列舉型別做為陣列索引的程式碼通常會檢查上限,以確保索引不在範圍內。 因為列舉變數預設為帶正負號,所以它可以有負值。 負陣列索引可以允許讀取、使用或甚至執行任意記憶體。

程式碼分析名稱: UNCHECKED_LOWER_BOUND_FOR_ENUMINDEX

範例

下列程式碼會產生此警告。 idx 會當做索引來存取 functions ,但永遠不會檢查下限。

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