Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Диагностическое правило актуально только для C.
Стандарт MISRA C определяет собственную модель типов — Essential type model.
Анализатор обнаружил ситуацию, при которой составное выражение, участвующее в арифметической операции, имеет более узкий сущностный тип, чем другой операнд. Вычисление такого составного выражения может привести к переполнению.
Рассмотрим следующий синтетический пример:
uint16_t w1; uint16_t w2; uint32_t dw1; // .... return w1 * w2 + dw1;
Несмотря на то, что на типичных платформах (x86/ARM) тип uint16_t соответствует типу unsigned short и при вычислении выражения он расширится до типа int, на других платформах (например, 16-битных микроконтроллерах) uint16_t может соответствовать типу unsigned int, поэтому расширения до 32 бит не произойдёт, из-за чего в результате умножения возможно переполнение.
Чтобы исправить ситуацию, нужно привести один из операндов составного выражения к результирующему типу.
Например:
return (uint32_t)w1 * w2 + dw1;
В таком случае вычисление всего выражения будет происходить в более широком типе uint32_t.
Данная диагностика классифицируется как:
|