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 functions
a , 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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de