V2568. MISRA. Both operands of an operator should be of the same type category.
Диагностическое правило основано на руководстве 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) ....
}
Данная диагностика классифицируется как:
|