Main Content

MISRA C++:2008 Rule 5-3-1

Each operand of the ! operator, the logical && or the logical || operators shall have type bool

Description

Rule Definition

Each operand of the ! operator, the logical && or the logical || operators shall have type bool.

Rationale

Use of non-bool operands with the logical operators !, && or ||, is likely to indicate a programming error.

Polyspace Implementation

The checker reports a violation if the operands of the logical operators !, && or ||, are not effectively boolean. Allowed operands are:

  • Variables of type bool or specified as effectively boolean using the option Effective boolean types (-boolean-types).

  • Expressions that compare two variables using operators such as == or < and return a boolean.

Troubleshooting

If you expect a rule violation but Polyspace® does not report it, see Diagnose Why Coding Standard Violations Do Not Appear as Expected.

Examples

expand all

In this example, both operands of the logical && in the if condition are effectively boolean and comply with the rule. The right operand of the logical && in the else if condition has a non-boolean type (int32_t) and violates the rule.

#include <cstdint>

class Pair
{
    int32_t leftVal;
    int32_t rightVal;
public:
    bool operator==(const Pair& anotherPair) {
        return(((*this).leftVal == anotherPair.leftVal)
             &&((*this).rightVal == anotherPair.rightVal));
    }
};

Pair getAPair();
int32_t checkPair(const Pair*);

void main() {
    Pair aPair = getAPair();
    Pair anotherPair = getAPair();
    Pair athirdPair = getAPair();
    
    if((aPair == anotherPair) &&
       (aPair == athirdPair)) //Compliant
       {}
    else if((aPair == anotherPair) && //Noncompliant
            (checkPair(&athirdPair))) 
       {} 
}

Check Information

Group: Expressions
Category: Required

Version History

Introduced in R2013b