bugprone-assignment-in-selection-statement¶
Finds assignments within selection statements.
Such assignments may indicate programmer error because they may have been
intended as equality tests. The selection statements are conditions of if
and loop (for, while, do) statements, condition of conditional
operator (?:) and any operand of a binary logical operator (&&,
||). The check finds assignments within these contexts if the single
expression is an assignment or the assignment is contained (recursively) in
last operand of a comma (,) operator or true and false expressions in a
conditional operator. The warning is suppressed if the assignment is placed in
extra parentheses, but only if the assignment is the single expression of a
condition (of if or a loop statement).
This check corresponds to the CERT rule EXP45-C. Do not perform assignments in selection statements.
Examples¶
The check emits a warning in the following cases at the indicated locations:
int x = 3;
if (x = 4) // should it be `x == 4` instead of 'x = 4' ?
x = x + 1;
while ((x <= 11) || (x = 22)) // assignment appears as operand of a logical operator
x += 2;
do {
x += 5;
} while ((x > 10) ? (x = 11) : (x > 5)); // assignment in loop condition (from `x = 11`)
for (int i = 0; i == 2, x = 5; ++i) // assignment in loop condition (from last operand of comma)
foo1(i, x);
for (int i = 0; i == 2, (x = 5); ++i) // assignment is not a single expression, parentheses do not prevent the warning
foo1(i, x);
int a = (x == 2) || (x = 3); // assignment appears in the operand a logical operator
The following cases do not produce a warning:
if ((x = 1)) { // a single assignment between parentheses
x += 10;
if ((x = 1) != 0) { // assignment appears in a complex expression and without a logical operator
++x;
if (foo(x = 9) && array[x = 8]) { // assignment appears in argument of function call or array index
++x;
for (int i = 0; i = 2, x == 5; ++i) // assignment does not take part in the condition of the loop
foo1(i, x);