Do not use the assignment operator in the contexts listed in the following table because doing so typically indicates programmer error and can result in unexpected behavior.
Operator | Context |
---|---|
if | Controlling expression |
while | Controlling expression |
do ... while | Controlling expression |
for | Second operand |
?: | First operand |
?: | Second or third operands, where the ternary expression is used in any of these contexts |
&& | Either operand |
|| | either operand |
, | Second operand, when the comma expression is used in any of these contexts |
Noncompliant Code Example
...
This noncompliant code example has a typo that results in an assignment rather than a comparison.
Code Block | ||||
---|---|---|---|---|
| ||||
while (ch = '\t' && ch == ' ' && ch == '\n') { /* ... */ } |
Many compilers will warn about this condition. This coding error would typically be eliminated by adherence to MSC00-C. Compile cleanly at high warning levels. Although this code compiles, it will cause unexpected behavior to an unsuspecting programmer. If the intent was to verify a string such as a password, user name, or group user ID, the code may produce significant vulnerabilities and require significant debugging.
Compliant Solution (RHS Variable)
When comparisons are made between a variable and a literal or const-qualified variable, placing the variable on the right of the comparison operation can prevent a spurious assignment.
In this code example, the literals are placed on the left-hand side of each comparison. If the programmer were to inadvertently use an assignment operator, the statement would assign ch
to '\t'
, which is invalid and produces a diagnostic message.
Code Block | ||||
---|---|---|---|---|
| ||||
while ('\t' = ch && ' ' == ch && '\n' == ch) { /* ... */ } |
Due to the diagnostic, the typo will be easily spotted and fixed.
Code Block | ||||
---|---|---|---|---|
| ||||
while ('\t' == ch && ' ' == ch && '\n' == ch) { /* ... */ } |
As a result, any mistaken use of the assignment operator that could otherwise create a vulnerability for operations such as string verification will result in a compiler diagnostic regardless of compiler, warning level, or implementation.
Exceptions
EXP45-C-EX1: Assignment can be used where the result of the assignment is itself an operand to a comparison expression or relational expression. In this compliant example, the expression x = y
is itself an operand to a comparison operation:
Code Block | ||||
---|---|---|---|---|
| ||||
if ((x = y) != 0) { /* ... */ } |
EXP45-C-EX2: Assignment can be used where the expression consists of a single primary expression. The following code is compliant because the expression x = y
is a single primary expression:
Code Block | ||||
---|---|---|---|---|
| ||||
if ((x = y)) { /* ... */ } |
The following controlling expression is noncompliant because &&
is not a comparison or relational operator and the entire expression is not primary:
Code Block | ||||
---|---|---|---|---|
| ||||
if ((v = w) && flag) { /* ... */ } |
When the assignment of v
to w
is not intended, the following controlling expression can be used to execute the conditional block when v
is equal to w
:
Code Block | ||||
---|---|---|---|---|
| ||||
if ((v == w) && flag) { /* ... */ }; |
When the assignment is intended, the following controlling expression can be used:
Code Block | ||||
---|---|---|---|---|
| ||||
if (((v = w) != 0) && flag) { /* ... */ }; |
EXP45-C-EX3: Assignment can be used in a function argument or array index. In this compliant solution, the expression x = y
is used in a function argument:
Code Block | ||||
---|---|---|---|---|
| ||||
if (foo(x = y)) { /* ... */ } |
Risk Assessment
Errors of omission can result in unintended program flow.
Recommendation | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
EXP45-C | Low | Likely | Medium | P6 | L2 |
Automated Detection
Tool | Version | Checker | Description | ||||
---|---|---|---|---|---|---|---|
Astrée |
|
Supported, but no explicit checker | |||||||||
Clang |
| -Wparentheses | Can detect some instances of this rule, but does not detect all | ||||||
CodeSonar |
| LANG.STRUCT.CONDASSIG LANG.STRUCT.SE.COND LANG.STRUCT.USEASSIGN | Assignment in conditional Condition contains side effects Assignment result in expression | ||||||
Compass/ROSE |
Could detect violations of this recommendation by identifying any assignment expression as the top-level expression in an | |||||||||
| CC2.EXP18 | Fully implemented | |||||||
GCC |
|
Can detect violations of this recommendation when the | ||||||||
Klocwork |
|
LDRA tool suite |
| 114 S, 132 S | Enhanced Enforcement | ||||||
Parasoft C/C++test |
|
|
| BD-PB-CC |
Polyspace Bug Finder | R2016a | Invalid use of = operator | Assignment in control statement | ||||||
PRQA QA-C |
| 3314, 3326, 3344, 3416 | Partially implemented | ||||||
PRQA QA-C++ | 4.2 | 4071, 4074 |
SonarQube C/C++ Plugin |
| AssignmentInSubExpression |
PVS-Studio | 6.22 | V559, V633, V699 | General analysis rule set |
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
...
Key here (explains table format and definitions)
Taxonomy | Taxonomy item | Relationship |
---|---|---|
CERT C | EXP19-CPP. Do not perform assignments in conditional expressions | Prior to 2018-01-12: CERT: Unspecified Relationship |
CERT Oracle Secure Coding Standard for Java | EXP51-J. Do not perform assignments in conditional expressions | Prior to 2018-01-12: CERT: Unspecified Relationship |
ISO/IEC TR 24772:2013 | Likely Incorrect Expression [KOA] | Prior to 2018-01-12: CERT: Unspecified Relationship |
ISO/IEC TS 17961 | No assignment in conditional expressions [boolasgn] | 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-481 | 2017-07-05: CERT: Rule subset of CWE |
CERT-CWE Mapping Notes
Key here for mapping notes
...
CWE-480 = Subset( CWE-569)
Bibliography
[Dutta 03] | "Best Practices for Programming in C" |
[Hatton 1995] | Section 2.7.2, "Errors of Omission and Addition" |
...
...