Condividi tramite


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 functionsa , 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

C33011