V2584. MISRA. Expression used in condition should have essential Boolean type.

This diagnostic rule is based on the MISRA (Motor Industry Software Reliability Association) software development guide.

This rule only applies to programs written in C. Expressions used in 'if' / 'for' / 'while' conditions should have essential Boolean type.

The MISRA standard introduces the essential type model, where a variable might have one of the following types:

Thus, the standard allows the following expressions:

An example for which the analyzer will issue a warning:

void some_func(int run_it)
{
  if (run_it)
  {
    do_something();
  }

  // ....
}

Here the variable should be explicitly checked against zero:

void some_func(int run_it)
{
  if (run_it != 0)
  {
    do_something();
  }

  // ....
}

Another example:

void func(void *p)
{
  if (!p) return;
  // ....
}

To eliminate the issue, the pointer should be explicitly compared with the null:

void func(void *p)
{
  if (p == NULL) return;
  // ....
}

The analyzer will not issue a warning for such code:

void fun(void)
{
  while (1)
  {
    // ....
  }
}

This diagnostic is classified as:

  • MISRA-C-14.4