Unicorn with delicious cookie
Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
>
V2022. Implicit type conversion from...
menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

V2022. Implicit type conversion from integer type to enum type.

03 Дек 2024

Данное диагностическое правило добавлено по просьбе пользователей.

Правило позволяет найти все неявные приведения целочисленных типов к типам перечислений. Это помогает выполнить рефакторинг кода и иногда выявить ошибки.

Данное правило актуально только для языка 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', происходит неявное приведение типов, что может привести к передаче недопустимого значения.