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

Диагностическое правило основано на руководстве [MISRA](https://www.misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

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

Стандарт MISRA C определяет собственную модель типов — [Essential type model](https://pvs-studio.ru/ru/blog/terms/7007/)\.

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

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

Например:

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

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

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

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

![V2544_ru/image1.png](https://import.viva64.com/docx/blog/V2544_ru/image1.png)

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

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

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

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