Compiler Warning (level 4) C4770
enum 'simbol' yang divalidasi sebagian digunakan sebagai indeks
Pengkompilasi memperingatkan apakah nilai enum ditransmisikan atau di-alias ke jenis bilangan bulat, tetapi hasilnya tidak diperiksa untuk nilai non-negatif atau berlebihan.
Keterangan
Peringatan ini baru di Visual Studio 2013. Perlindungan pembersihan tidak diaktifkan secara default. Untuk mengaktifkannya sebagai peringatan tingkat 1, gunakan /w14770
. Untuk informasi tentang cara menonaktifkan peringatan berdasarkan versi kompilator, lihat Peringatan pengkompilasi menurut versi kompilator.
Contoh
Kode berikut menghasilkan peringatan 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];
}
Untuk memperbaiki peringatan, Anda dapat melemparkan nilai dalam cek ke unsigned int
, yang secara implisit memaksa nilai non-negatif:
if ((unsigned int)(e1) >= E_MAX)
return 0;
Atau, secara eksplisit periksa nilai non-negatif:
if ((int)(e1) >= E_MAX || (int)(e1) < 0)
return 0;