V2620. MISRA. Value of a composite expression should not be cast to a different essential type category or a wider essential type.
Диагностическое правило основано на руководстве 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) не происходило.
Данная диагностика классифицируется как:
|