﻿# V2620\. MISRA\. Value of a composite expression should not be cast to a different essential type category or a wider essential type\.

Диагностическое правило основано на руководстве [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/)\.

Приведение результата составного выражения к сущностному типу другой категории или к более широкому типу может стать причиной потери значений старших битов\.

Рассмотрим пример:

```cpp
int32_t foo(int16_t x, int16_t y)
{
  return (int32_t)(x * y);
}
```

Несмотря на то, что на типичных платформах \(x86/ARM\) тип `int16_t` соответствует типу `short`, и при вычислении выражения он расширится до типа `int`, на других платформах \(например, 16\-битных микроконтроллерах\) `int16_t` может соответствовать типу `int`, поэтому расширения до 32 бит не произойдёт, из\-за чего в результате умножения возможно переполнение\.

Исправить пример можно следующим образом:

```cpp
int32_t foo(int16_t x, int16_t y)
{
  return (int32_t)x * y;
}
```

В этом случае вычисление всего выражения будет происходить в более широком типе `int32_t`\.

Рассмотрим другой пример:

```cpp
int32_t sum(float x, float y)
{
  return (int32_t)(x + y);
}
```

Согласно модели сущностных типов, результирующий тип выражения относится к `essentially floating`** **категории, а тип `int32_t` к `essential signed` категории сущностных типов\. Приведение результата сложения к целому типу ведёт к потери точности\. Результат сложения двух чисел типа `float` также может быть больше, чем верхний предел диапазона типа `int32_t`\.

Допустимым вариантом может быть:

```cpp
float sum(float x, float y)
{
  return x + y;
}
```

Если в дальнейшем требуется привести результат выражения к типу `int`, то необходимо выполнить:

* проверку на то, что конвертируемое значение входит в диапазон значений типа;
* использовать функцию округления до целого\.

Тип составного выражения в сущностной модели определяется таким образом, как если бы расширения до `int` \(integer promotion\) не происходило\.