Данное диагностическое правило добавлено по просьбе пользователей.
Правило позволяет найти все неявные приведения целочисленных типов к типам перечислений. Это помогает выполнить рефакторинг кода и иногда выявить ошибки.
Данное правило актуально только для языка C.
Рассмотрим примеры конструкций, на которые анализатор выдаст предупреждение.
Пример N1:
typedef enum { Horizontal = 0x1, Vertical = 0x2 } Orientation; void foo1() { int pos = 1; Orientation orientation = pos; // V2022 }
В этом примере происходят неявные приведения целочисленного значения 'pos' к переменной типа 'Orientation'.
Пример N2:
Orientation GetOrientation (int pos) { return pos; // V2022 }
Функция 'GetOrientation' возвращает значение типа 'Orientation' и неявно приводит значение 'pos' к этому типу.
Пример N3:
Orientation GetOrientation (bool b) { int posOne = 1; int posTwo = 2; return b ? posOne : posTwo; // V2022 }
В этом примере функция использует условный оператор (?:) для выбора между двумя целочисленными переменными 'posOne' и 'posTwo', что также приводит к неявному приведению.
Пример N4:
void foo2(Orientation o){} void foo3() { foo2(Horizontal); //ok foo2(Horizontal | Vertical); // V2022 }
В результате операции 'Horizontal | Vertical' получается целое число, представляющее побитовый результат. При передаче этого значения в функцию 'foo2', принимающую аргумент типа 'Orientation', происходит неявное приведение типов, что может привести к передаче недопустимого значения.