Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Диагностическое правило актуально только для C.
Стандарт MISRA C определяет собственную модель типов — Essential type model.
Значения, использующиеся в выражениях, должны иметь соответствующие сущностные типы.
В языке C нет ограничений на операции с базовыми типами, но некоторые из этих операций могут иметь неуточнённое/неопределённое поведение или вовсе не иметь смысла.
Например:
Также могут быть опасными неявные преобразования к Boolean, т.к. не все десятичные дроби могут быть представлены в двоичной системе счисления.
void Foo(float f, _Bool other_expr)
{
if (f || other_expr) ....
}
В следующей таблице знаком X отмечены пересечения типов операндов и операций, из которых не следует составлять выражения.

Пример кода, на который будут выданы соответствующие сообщения:
void Foo(float f, _Bool b, int a[], enum E e)
{
if (~a[(e ? 1 : 2) >> (-b * f --> +b) << signed(-24U)]) ....;
}
Исключение. Выражение знакового типа с положительным значением может быть использовано в качестве правого операнда оператора сдвига (>>, <<).
void foo(signed vi, unsigned _)
{
assert(vi >= 0);
_ >> vi;
_ << vi;
}
Данная диагностика классифицируется как:
|