警告 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)();
}
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈