# V2544. MISRA. The values used in expressions should have appropriate essential types.

Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.

Диагностическое правило актуально только для C.

Стандарт MISRA C определяет собственную модель типов — Essential type model.

Значения, использующиеся в выражениях, должны иметь соответствующие сущностные типы.

В языке C нет ограничений на операции с базовыми типами, но некоторые из этих операций могут иметь неуточнённое/неопределённое поведение или вовсе не иметь смысла.

Например:

- получать значение в массиве, используя индекс булевого типа;
- пытаться сменить знак беззнакового целого числа;
- работать с битовым представлением, используя для этого переменные не беззнакового целого типа.

Также могут быть опасными неявные преобразования к `Boolean`, т.к. не все десятичные дроби могут быть представлены в двоичной системе счисления.

    void Foo(float f, _Bool other_expr)
    {
      if (f || other_expr) ....
    }

В следующей таблице знаком `X` отмечены пересечения типов операндов и операций, из которых не следует составлять выражения.

Пример кода, на который будут выданы соответствующие сообщения:

    void Foo(float f, _Bool b, int a[], enum E e)
    {
      if (~a[(e ? 1 : 2) >> (-b * f --> +b) << signed(-24U)]) ....;
    }

Исключение. Выражение знакового типа с положительным значением может быть использовано в качестве правого операнда оператора сдвига (`>>`, `<<`).

    void foo(signed vi, unsigned _)
    {
      assert(vi >= 0);
      _ >> vi;
      _ << vi;
    }

Данная диагностика классифицируется как:

MISRA-C-2012-10.1 MISRA-C-2023-10.1