Our website uses cookies to enhance your browsing experience.
Accept
to the top
close form

Fill out the form in 2 simple steps below:

Your contact information:

Step 1
Congratulations! This is your promo code!

Desired license type:

Step 2
Team license
Enterprise license
** By clicking this button you agree to our Privacy Policy statement
close form
Request our prices
New License
License Renewal
--Select currency--
USD
EUR
* By clicking this button you agree to our Privacy Policy statement

close form
Free PVS‑Studio license for Microsoft MVP specialists
* By clicking this button you agree to our Privacy Policy statement

close form
To get the licence for your open-source project, please fill out this form
* By clicking this button you agree to our Privacy Policy statement

close form
I am interested to try it on the platforms:
* By clicking this button you agree to our Privacy Policy statement

close form
check circle
Message submitted.

Your message has been sent. We will email you at


If you do not see the email in your inbox, please check if it is filtered to one of the following folders:

  • Promotion
  • Updates
  • Spam

Webinar: C++ semantics - 06.11

>
>
>
V2584. MISRA. Expression used in condit…
menu mobile close menu
Analyzer diagnostics
General Analysis (C++)
General Analysis (C#)
General Analysis (Java)
Micro-Optimizations (C++)
Diagnosis of 64-bit errors (Viva64, C++)
Customer specific requests (C++)
MISRA errors
AUTOSAR errors
OWASP errors (C#)
Problems related to code analyzer
Additional information
toggle menu Contents

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

Jun 09 2021

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:

  • Boolean, if it uses true/false values: '_Bool';
  • signed, if it uses signed integer numbers, or is an unnamed enum: 'signed char', 'signed short', 'signed int', 'signed long', 'signed long long', 'enum { .... };';
  • unsigned, if it uses unsigned integer numbers: 'unsigned char', 'unsigned short', 'unsigned int', 'unsigned long', 'unsigned long long';
  • floating, if it uses floating point numbers: 'float', 'double', 'long double';
  • character, if it uses only characters: 'char';
  • Named enum, if it uses a named set of user-specific values: 'enum name { .... };'

Thus, the standard allows the following expressions:

  • expression of type bool (from C99);
  • expression containing a comparison with '==', '!=', '<', '>', '<=', '>=' operators;
  • constants with value 0 or 1.

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