Анализатор обнаружил потенциально возможную ошибку в коде, связанную с тем, что в тернарном операторе '?:' в качестве второго и третьего операндов используются константные значения из разных перечислений.
Рассмотрим пример такого кода:
enum OnlyOdd { Not_Odd, Odd }; enum OnlyEven { Not_Even, Even }; int isEven(int a) { return (a % 2) == 0 ? Even : Odd; }
Функция проверяет число на четность, но в возвращающемся значении используются константы из двух разных перечислений (OnlyEven::Even и OnlyOdd::Odd), приводимые к типу 'int'. В результате, независимо от переданного аргумента 'a', функция всегда будет возвращать 1 (истину). Корректный код должен выглядеть следующим образом:
enum OnlyOdd { Not_Odd, Odd }; enum OnlyEven { Not_Even, Even }; int isEven(int a) { return (a % 2) == 0 ? Even : Not_Even; }
Примечание. Нормальной ситуацией считается применение двух разных перечислений без имени, например:
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; // нет V771 ....