Condividi tramite


Avviso C33011

Limite superiore deselezionato per l'enumerazione 'enum' utilizzata come indice.

Osservazioni:

Questo avviso viene attivato per un'enumerazione usata come indice in una matrice, se il limite inferiore viene controllato per il relativo valore, ma non per il limite superiore.

Nome dell'analisi del codice: UNCHECKED_UPPER_BOUND_FOR_ENUMINDEX

Esempio

Il codice che usa tipi enumerati come indici per le matrici deve controllare il valore dell'enumerazione sia per i limiti inferiori che superiori. Se il valore di enumerazione viene controllato solo per il limite inferiore usato per indicizzare in una matrice di valori (o una matrice di puntatori a funzione), può consentire la lettura, l'utilizzo o l'esecuzione di memoria arbitraria.

typedef void (*PFN)();

enum class Index
{
    Zero,
    One,
    Two,
    Three,
    Max
};

void foo(Index idx, PFN(&functions)[5])
{
    if (idx < Index::Zero)
        return;

    auto pfn = functions[static_cast<int>(idx)];    // C33011
    if (pfn != nullptr)
        (*pfn)();
    // ......
}

Questi avvisi vengono corretti controllando anche il valore dell'indice per il limite superiore:

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)];    // OK
    if (pfn != nullptr)
        (*pfn)();
    // ......
}

Vedi anche

C33010