Avviso C33010
Limite inferiore deselezionato per l'enumerazione 'enum' usata come indice.
Questo avviso viene attivato se un'enumerazione viene usata sia come indice in una matrice che non viene controllata sul limite inferiore.
Osservazioni:
Il codice che usa tipi enumerati come indici per le matrici spesso verifica la presenza del limite superiore per garantire che l'indice non sia compreso nell'intervallo. Poiché una variabile enum è firmata per impostazione predefinita, può avere un valore negativo. Un indice di matrice negativo può consentire la lettura, l'uso o l'esecuzione di memoria arbitraria.
Nome dell'analisi del codice: UNCHECKED_LOWER_BOUND_FOR_ENUMINDEX
Esempio
Il codice seguente genera questo avviso. idx
viene usato come indice per accedere functions
a , ma il limite inferiore non viene mai controllato.
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)();
}
Il codice seguente corregge questo avviso controllando anche il limite inferiore per assicurarsi idx
che non sia 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)();
}
In alternativa, il problema può essere risolto scegliendo un tipo sottostante per Index
che non è firmato. Poiché un valore senza segno è sempre positivo, è sufficiente controllare solo il limite superiore.
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)();
}
Vedi anche
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per