Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
>
V2620. MISRA. Value of a composite...
menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

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

25 Авг 2025

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

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

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

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

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

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 бит не произойдёт, из-за чего в результате умножения возможно переполнение.

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

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

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

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

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

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

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

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

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

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

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

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

  • MISRA-C-2012-10.8
  • MISRA-C-2023-10.8