コンパイラの警告 (レベル 4) C4770
インデックスとして使用される部分的に検証された列挙型 'symbol'
コンパイラは、列挙型の値が整数型にキャストまたはエイリアス化された場合に警告しますが、結果に負以外の値または過剰な値がチェックされません。
解説
この警告は、Visual Studio 2013 の新機能です。 これは、既定では有効になっていません。 レベル 1 の警告として有効にするには、 /w14770
を使用します。 コンパイラのバージョン別の警告を無効にする方法は、「コンパイラのバージョン別のコンパイラの警告」を参照してください。
例
次のコードでは、警告 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];
}
警告を修正するには、チェックの値を unsigned int
にキャストし、暗黙的に負でない値を強制します。
if ((unsigned int)(e1) >= E_MAX)
return 0;
または、負でない値を明示的に確認します。
if ((int)(e1) >= E_MAX || (int)(e1) < 0)
return 0;