警告 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