Bagikan melalui


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;