The analyzer detected a possible error that has to do with the ternary operator '?:' using constants from different enumerations as its second and third operands.
Consider the following example:
enum OnlyOdd { Not_Odd, Odd }; enum OnlyEven { Not_Even, Even }; int isEven(int a) { return (a % 2) == 0 ? Even : Odd; }
This function checks if the number passed as an argument is even, but its return value is evaluated using constants from two different enums (OnlyEven::Even and OnlyOdd::Odd) cast to 'int'. This mistake will cause the function to return 1 (true) all the time regardless of the 'a' argument's actual value. This is what the fixed code should look like:
enum OnlyOdd { Not_Odd, Odd }; enum OnlyEven { Not_Even, Even }; int isEven(int a) { return (a % 2) == 0 ? Even : Not_Even; }
Note. Using two different unnamed enumerations is considered a normal practice, for example:
enum { FLAG_FIRST = 0x01 << 0, FLAG_SECOND = 0x01 << 1, .... }; enum { FLAG_RW = FLAG_FIRST | FLAG_SECOND, .... }; .... bool condition = ...; int foo = condition ? FLAG_SECOND : FLAG_RW; // no V771 ....