Aviso do compilador (nível 4) C4770
'símbolo' de enum parcialmente validado usado como índice
O compilador avisa se um valor de enum é convertido ou aliado para um tipo inteiro, mas o resultado não é verificado para valores não negativos ou excessivos.
Comentários
Esse aviso é novo no Visual Studio 2013. Ela não vem habilitada por padrão. Para habilitá-lo como um aviso de nível 1, use /w14770
. Para obter informações sobre como desabilitar avisos por versão do compilador, consulte Avisos do compilador por versão do compilador.
Exemplo
O código a seguir produz o aviso 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];
}
Para corrigir o aviso, você pode converter o valor na verificação para unsigned int
, o que implicitamente força um valor não negativo:
if ((unsigned int)(e1) >= E_MAX)
return 0;
Ou, verifique explicitamente se há um valor não negativo:
if ((int)(e1) >= E_MAX || (int)(e1) < 0)
return 0;