主要内容

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.1

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


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.