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