user2986042
user2986042

Reputation: 1270

How to solve " Controlling expression is not an 'essentially Boolean' expression " in MISRA code?

I have a simple macro function which will check the condition and return an Boolean value. Below is the snippet of code

assume: #define boolean bool

Test.h file

#define CHECK_STATE(X)            (boolean)(STATE_VALUE == (uint8)(X) )

Test.c file

enum MY_STATE{

    STATE_0,  
    STATE_1,     
    STATE_2    
};

static uint8 STATE_VALUE  = (uint8)STATE_0; //This value update in the code dynamically from state 0 to 2

if(CHECK_STATE(STATE_1))  /*MISRA warning: Controlling expression is not an 'essentially Boolean' expression. */
{
  /*If condition pass*/
}
else
{
  /*If condition failes*/
}

In the above code CHECK_STATE function will return a Boolean value. So if loop can check either true or false. So why MISRA is throwing the warning "not an 'essentially Boolean' expression" ? Any suggestion to fix this type of warnings?

Upvotes: 1

Views: 455

Answers (2)

Andrew
Andrew

Reputation: 2322

Of course, MISRA prefers you to use inline-functions to function-like macros, to allow better type matching... so your tool is missing a D.4.9 violation! But to the matter in hand...

Your tool is not correctly configured to treat you custom boolean as a boolean-type; this is compounded by your code being unnecessarily verbose.

There are two ways around this:

1. Simplify Use the MISRA essential types, and use the enumeration type

Test.h file

#define CHECK_STATE(X) ( STATE_VALUE == (X) )  // No casts needed!

Test.c file

enum MY_STATE {
    STATE_0,  
    STATE_1,     
    STATE_2    
};

static enum MY_STATE STATE_VALUE  = STATE_0; // No cast needed

if ( CHECK_STATE( STATE_1 ) ) 
{
  /*If condition pass*/
}
else
{
  /*If condition fail*/
}

2. Configure the tool See @Eva4684's answer for a hint

IMHO the KISS principle should apply here

As an aside, why are you defining the macro in a header file, when both the variable are the enumeration are module scope?

Upvotes: 0

Eva4684
Eva4684

Reputation: 47

In your analyzer you should be able to specify your custom bool type, e.g. in PClint:

-strong(B,boolean) /* custom bool */

And define it as:

typedef uint8_t boolean;

I also prefer custom bool since in many embedded libraries/HAL define their own bool, which can cause collision.

Upvotes: 0

Related Questions