 
                            Do Mixing bitwise and relational operators in the same full expression can be a sign of a logic error in the expression where a logical operator is usually the intended operator. Do not use the bitwise AND (&), ampersand) or bitwise OR (|), pipe) operator in a conditional expression because this typically indicates programmer error and can result in unexpected behavior. Only use & or | only for bitwise operations, and to use && or || only for logical operationsor bitwise XOR (^) operators with an operand of type _Bool, or the result of a relational-expression or equality-expression. If the bitwise operator is intended, it should be indicated with use of a parenthesized expression.
Noncompliant Code Example
In this noncompliant code example, a bitwise expression is used in a conditional expression. bitwise & operator is used with the results of two equality-expressions:
| Code Block | ||||
|---|---|---|---|---|
| 
 | ||||
| if (!(getuid() == 0 & geteuidgetgid() == 0)) { /* ... */ } | 
Compliant Solution
This compliant solution uses the && operator for the logical operation within the conditional expression.:
| Code Block | ||||
|---|---|---|---|---|
| 
 | ||||
| if (!(getuid() == 0 && geteuidgetgid() == 0)) { /* ... */ } | 
Bibliography
Risk Assessment
| Rule | Severity | Likelihood | Remediation Cost | Priority | Level | 
|---|---|---|---|---|---|
| EXP46-C | Low | Likely | Low | P9 | L2 | 
Automated Detection
| Tool | Version | Checker | Description | ||||||
|---|---|---|---|---|---|---|---|---|---|
| Astrée | 
 | bitwise-operator-with-boolean-like-operand | Fully checked | ||||||
| Axivion Bauhaus Suite | 
 | CertC-EXP46 | |||||||
| CodeSonar | 
 | LANG.TYPE.IOT | Inappropriate operand type | ||||||
| 
 | CONSTANT_EXPRESSION_RESULT | Partially implemented | |||||||
| Cppcheck | 
 | bitwiseOnBoolean | |||||||
| Cppcheck Premium | 
 | bitwiseOnBoolean | |||||||
| Helix QAC | 
 | C3344, C4502 C++3709 | |||||||
| Klocwork | 
 | MISRA.LOGIC.OPERATOR.NOT_BOOL | |||||||
| LDRA tool suite | 
 | 136 S | Fully Implemented | ||||||
| Parasoft C/C++test | 
 | CERT_C-EXP46-b | Expressions that are effectively Boolean should not be used as operands to operators other than (&&, ||, !, =, ==, !=, ?:) | ||||||
| PC-lint Plus | 
 | 514 | Fully supported | ||||||
| Polyspace Bug Finder | 
 | CERT C: Rule EXP46-C | Checks for bitwise operations on boolean operands (rule fully covered) | ||||||
| PVS-Studio | 
 | V564, V1015 | |||||||
| RuleChecker | 
 | bitwise-operator-with-boolean-like-operand | Fully checked | ||||||
| Security Reviewer - Static Reviewer | 
 | C73 | Fully implemented | 
Related Guidelines
Key here (explains table format and definitions)
| Taxonomy | Taxonomy item | Relationship | 
|---|---|---|
| ISO/IEC TR 24772:2013 | Likely Incorrect Expression [KOA] | Prior to 2018-01-12: CERT: Unspecified Relationship | 
| CWE 2.11 | CWE-480, Use of incorrect operator | 2017-07-05: CERT: Rule subset of CWE | 
| CWE 2.11 | CWE-569 | 2017-07-06: CERT: Rule subset of CWE | 
CERT-CWE Mapping Notes
Key here for mapping notes
CWE-480 and EXP46-C
Intersection( EXP45-C, EXP46-C) = Ø
CWE-480 = Union( EXP46-C, list) where list =
- Usage of incorrect operator besides s/&/&&/ or s/|/||/
Bibliography
| [Hatton 1995] | Section 2.7.2, "Errors of Omission and Addition" | 
...
  Wiki Markup