警告 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)();
}