MISRA Discussion Forums

Full Version: Rules 12.1 and 12.5 and unary operators
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
It is said in rules 12.1 and 12.5 that 12.5 is a special case of 12.1.

However, in rule 12.1, it is stated that no parentheses are required for the operand of a unary operator
while in rule 12.5 it is said that the operands of the logical operators && and || must be primary expressions;
the latter is exemplified in 12.5 with the following example:

if ( x && ( !y ) ) /* make !y primary */

So for rule 12.1, is something like:
if ( x && !y )
...
a violation?
Rule 12.1 provides some guidance on the use of parentheses in expressions. For logical operators, Rule 12.5 provides a stricter rule and therefore overrides 12.1 in this instance.
What is the rationale for unary logical not operator (!a) being treated differently than the unary minus operator (-a) ?
When the MISRA-C:2004 guidelines were updated to MISRA C:2012 it was realised that there was no reason to maintain the difference between the unary operators. Rule 12.5 was removed and the requirement for parentheses is now covered only by 12.1. This means that postfix, unary and cast operands of && and || are permitted without brackets in MISRA C:2012.

If you are continuing to use MISRA-C:2004, then the justification for any deviation could include that this Rule has been relaxed for MISRA C:2012