description | title | ms.date | f1_keywords | helpviewer_keywords | ||
---|---|---|---|---|---|---|
Learn more about: Compiler Warning (level 4) C4770 |
Compiler Warning (level 4) C4770 |
11/02/2022 |
|
|
partially validated enum 'symbol' used as index
The compiler warns if an enum value is cast or aliased to an integer type, but the result isn't checked for non-negative or excessive values.
This warning is new in Visual Studio 2013. It's not enabled by default. To enable it as a level 1 warning, use /w14770
. For information on how to disable warnings by compiler version, see Compiler warnings by compiler version.
The following code produces warning 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];
}
To fix the warning, you could cast the value in the check to unsigned int
, which implicitly forces a non-negative value:
if ((unsigned int)(e1) >= E_MAX)
return 0;
Or, explicitly check for a non-negative value:
if ((int)(e1) >= E_MAX || (int)(e1) < 0)
return 0;