MISRA Discussion Forums

Full Version: Rule 14.4 and the explanation is not enough to understand why
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
MISRA C 2012 guideline says:
Strong typing requires the controlling expression of an if statement or iteration-statement to have
essentially Boolean type.

For example:
typedef unsigned short tudtKalEvents;
#define udtSTOP_EVENT (tudtKalEvents)0x0001;
Code:
if(udtEvents & (tudtKalEvents) udtSTOP_EVENT)
  {
        vidStop();
  }
I think the code is ok, I use the & statement as the conditional expression. As we know, the value is not equal to zero, the condition shall be judged to be true,
why We must use the boolean type?
Just to be clear, you don't need to use the boolean type, but you need to form a boolean expression, e.g.
Code:
if ((udtEvents & (tudtKalEvents)udtSTOP_EVENT) != 0u)
{
  vidStop();
}
It´s all about avoiding implicit conversion as much as possible.
MISRA-C introduces a strong typing model to help users avoid unexpected issues which occur in the C typing model.
The rule prevents the accidental use of integer expression when a boolean expression was intended.

To be compliant with MISRA rule 14.4 you should write your test as a boolean expression:
Code:
if((udtEvents & udtSTOP_EVENT) != 0U  )