Avviso del compilatore (livello 4) C4770
enumerazione parzialmente convalidata 'symbol' usata come indice
Il compilatore avvisa se viene eseguito il cast o l'aliasing di un valore enumerazione a un tipo integer, ma il risultato non viene controllato per i valori non negativi o eccessivi.
Osservazioni:
Questo avviso è una novità di Visual Studio 2013. Non è abilitata per impostazione predefinita. Per abilitarlo come avviso di livello 1, usare /w14770
. Per informazioni su come disabilitare gli avvisi in base alla versione del compilatore, vedere Avvisi del compilatore per versione del compilatore.
Esempio
Il codice seguente genera l'avviso C4770:
// c4770.cpp
// compile by using: cl /GL /w14770 c4770.cpp
enum E { a 0, b, c, E_MAX };
int main(int argc, char *argv[])
{
const E e1 = E(argc); // value unknown at compile time
if ((int)(e1) >= E_MAX)
return 0;
const int n = e1 + e1; // C4770 partially validated enum used as index
return argv[n][n];
}
Per correggere l'avviso, è possibile eseguire il cast del valore nel controllo a unsigned int
, che forza in modo implicito un valore non negativo:
if ((unsigned int)(e1) >= E_MAX)
return 0;
In alternativa, verificare in modo esplicito la presenza di un valore non negativo:
if ((int)(e1) >= E_MAX || (int)(e1) < 0)
return 0;