V2584. MISRA. Expression used in condition should have essential Boolean type.
Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Это правило актуально только для C. В условиях конструкций 'if' / 'for' / 'while' должны использоваться выражения, имеющие essential Boolean тип.
Стандарт MISRA определяет следующую модель сущностных типов (Essential type model), в которой переменная может иметь тип:
- Boolean, если оперирует булевыми значениями true/false: '_Bool';
- signed, если оперирует знаковыми целыми числами или является безымянным enum: 'signed char', 'signed short', 'signed int', 'signed long', 'signed long long', 'enum { .... };';
- unsigned, если оперирует беззнаковыми целыми числами: 'unsigned char', 'unsigned short', 'unsigned int', 'unsigned long', 'unsigned long long';
- floating, если оперирует числами с плавающей точкой: 'float', 'double', 'long double';
- character, если оперирует только символами: 'char';
- Именованный enum, если оперирует с именованным множеством определенных пользователем значений: 'enum name { .... };'
Таким образом, стандарт разрешает следующие виды выражений:
- выражение, имеющее тип bool (начиная с C99);
- выражение, в котором производится сравнение с помощью операторов '==', '!=', '<', '>', '<=', '>=';
- константы со значением 0 или 1.
Пример, на который анализатор выдаст предупреждение:
void some_func(int run_it)
{
if (run_it)
{
do_something();
}
// ....
}
Здесь нужно явно проверить, что переменная не равна нулю:
void some_func(int run_it)
{
if (run_it != 0)
{
do_something();
}
// ....
}
Еще один пример:
void func(void *p)
{
if (!p) return;
// ....
}
Для устранения нарушения следует явно сравнить указатель с нулевым:
void func(void *p)
{
if (p == NULL) return;
// ....
}
Анализатор не выдаст предупреждение на подобный код:
void fun(void)
{
while (1)
{
// ....
}
}
Данная диагностика классифицируется как:
|