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), в которой переменная может иметь тип:

Таким образом, стандарт разрешает следующие виды выражений:

Пример, на который анализатор выдаст предупреждение:

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)
  {
    // ....
  }
}

Данная диагностика классифицируется как:

  • MISRA-C-14.4