V2022. Implicit type conversion from integer type to enum type.
Данное диагностическое правило добавлено по просьбе пользователей.
Правило позволяет найти все неявные приведения целочисленных типов к типам перечислений. Это помогает выполнить рефакторинг кода и иногда выявить ошибки.
Данное правило актуально только для языка 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', происходит неявное приведение типов, что может привести к передаче недопустимого значения.