Using the assignment operator in the outermost expression in a conditional expression shall be diagnosed because this typically indicates programmer error and can result in unexpected behavior.
Noncompliant Code Example
In this noncompliant code example, an assignment expression is the outermost expression in a conditional expression.
if (a = b) { /* ... */ }
Compliant Solution
This conditional block is now executed when a
is equal to b
.
if (a == b) { /* ... */ }
This is an alternative compliant solution:
if ((a = b) != 0) { /* ... */ }
It is less desirable in general, depending on what was intended, because it mixes the assignment in the condition, but it is clear that the programmer intended the assignment to occur.
Risk Assessment
Errors of omission can result in unintended program flow.
Recommendation |
Severity |
Likelihood |
Remediation Cost |
Priority |
Level |
---|---|---|---|---|---|
MSC02-C |
low |
likely |
medium |
P6 |
L2 |
Automated Detection
The LDRA tool suite Version 7.6.0 can detect violations of this recommendation???
GCC Compiler Version 4.4.0 can detect violations of this recommendation when the -Wall
flag is used???
Compass/ROSE could detect violations of this recommendation by identifying any assignment expression as the top-level expression in an if or while statement.
Klocwork Version 8.0.4.16 can detect violations of this rule with the ASSIGCOND.BOOL, ASSIGCOND.CALL, ASSIGCOND.GEN, and EFFECT checkers.
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
Other Languages
This rule appears in the C++ Secure Coding Standard as EXP18-CPP. Do not perform assignments in conditional expressions.
Bibliography
[Hatton 95] Section 2.7.2, "Errors of omission and addition"
[ISO/IEC PDTR 24772] "KOA Likely Incorrect Expressions"
[MITRE 07] CWE ID 482, "Comparing instead of Assigning," CWE ID 480, "Use of Incorrect Operator"