Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Диагностическое правило актуально только для C.
Стандарт MISRA C определяет собственную модель типов — Essential type model.
Преобразование арифметических операндов, чьи сущностные типы не совпадают, может привести к неочевидным проблемам.
Язык C предоставляет свободу преобразования арифметических типов. Это может повлечь за собой неочевидные проблемы, такие как потеря знака, переполнение или потеря значимости. Несмотря на свою строгость, стандарт MISRA C разрешает преобразования арифметических типов в случае, когда сущностные типы операндов совпадают.
Исключение. Левый и правый операнды операторов +, -, +=, -= могут иметь сущностные character и signed/unsigned типы соответственно.
Пример кода, на который анализатор выдаст предупреждения:
enum { A };
int i;
unsigned u;
void foo()
{
A + u;
0.f - i;
A > (_Bool)0;
}
Пример корректного кода:
void foo(unsigned short x, _Bool b)
{
x + 1UL;
if (b && x > 4U) ....
}
Данная диагностика классифицируется как:
|