Share via


Advertencia C33010

Desactive el límite inferior de la enumeración 'enum' que se usa como índice.

Esta advertencia se desencadena si se usa una enumeración como índice en una matriz y no está activada en el límite inferior.

Comentarios

El código que usa tipos enumerados como índices para matrices a menudo comprobará el límite superior para asegurarse de que el índice no está fuera del intervalo. Dado que una variable de enumeración tiene signo de forma predeterminada, puede tener un valor negativo. Un índice de matriz negativo puede permitir que la memoria arbitraria se lea, use o incluso se ejecute.

Nombre del análisis de código: UNCHECKED_LOWER_BOUND_FOR_ENUMINDEX

Ejemplo

El código siguiente genera esta advertencia. idx se usa como índice para acceder functionsa , pero nunca se comprueba el límite inferior.

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

El código siguiente corrige esta advertencia comprobando también el límite inferior para asegurarse idx de que no es negativo:

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

Como alternativa, el problema se puede corregir eligiendo un tipo subyacente para Index que no esté firmado. Dado que un valor sin signo siempre es positivo, solo es suficiente comprobar el límite superior.

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

Consulte también

C33011