Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • Controlling expression of if, switch  switch (selection statement)
  • Controlling expression of while, do...while (iteration statement) 
  • Second operand of for for (iteration statement) 
  • First operand of  ?: (selection statement)
  • Either operand of || or && (logical operators) 
  • Second operand of comma operator when the comma expression is used in any of these contexts
  • Second and third operands  of ?:  (selection statement) where the ternary expression is used in any of these contexts

...

In this noncompliant example, the expression x = y is used as the controlling expression of the while statement.

Code Block
bgColor#FFcccc
langc
 do { /* ... */ } while ( foo(), x = y ) ;

...

Code Block
bgColor#ccccff
langc
do { /* ... */ } while ( foo(), (x = y) != 0) ;

Noncompliant Code Example

In this non-compliant noncompliant example, the expression p = q is used as the controlling expression of the while statement.

Code Block
bgColor#FFcccc
langc
 do { /* ... */ } while ( x = y, p = q ) ;

Compliant Solution

This is a compliant example because the expression x = y is not used as the controlling expression of the while statement.

Code Block
bgColor#ccccff
langc
do { /* ... */ } while ( x = y, p == q ) ; 

Exceptions

EXP18-EXP1: Assignment can be used where the result of the assignment is itself a parameter to a comparison expression or relational expression.

...

In this compliant example, the expression  x = y is a single primary expression.

Code Block
bgColor#ccccff
langc
if ( ( x = y ) ) { /* ... */ } 

EXP18-EXP3: Assignment can be used in the above contexts if it occurs in a function argument or array index.

In this compliant example, the expression x = y is used in a function argument.

 

Code Block
bgColor#ccccff
langc
if ( foo( x = y ) ) { /* ... */ } 

This is a

non-compliant

noncompliant example because && is not a comparison or relational operator and the entire expression is not primary.

Code Block
bgColor#FFcccc
langc
if ( ( v = w ) && flag ) { /* ... */ }

When the assignment of v to w is not intended, this conditional block is now executed when v is equal to w.

Code Block
bgColor#ccccff
langc
if ( ( v == w ) && flag ) { /* ... */ }; 

When the assignment is intended, the following is an alternative compliant solution:

Code Block
bgColor#ccccff
langc
if ( ( (v = w) != 0 ) && flag ) { /* ... */ };

Risk Assessment

Errors of omission can result in unintended program flow.

...

LDRA tool suiteLDRALDRA  Compass/ROSE

Tool

Version

Checker

Description

Compass/ROSE

 

 

Could detect violations of this recommendation by identifying any assignment expression as the top-level expression in an if or while statement.

ECLAIR

Include Page
ECLAIR_V
ECLAIR_V

exprctxt

Fully implemented.

GCC

Include Page
GCC_V
GCC_V

 

Can detect violations of this recommendation when the -Wall flag is used.

 

 

Could detect violations of this recommendation by identifying any assignment expression as the top-level expression in an if or while statement.

Klocwork

Include Page
Klocwork_V
Klocwork_V

ASSIGCOND.GEN
ASSIGCOND.CALL

 

ECLAIRLDRA tool suite

Include Page
ECLAIRLDRA_VECLAIR
LDRA_V

exprctxt 

Fully implemented. 

PRQA QA-C
Include Page
PRQA_V
PRQA_V
3314Partially implemented.

...

No assignment in conditional expressions [boolasgn]
CERT C++ Secure Coding StandardEXP19-CPP. Do not perform assignments in conditional expressions
CERT Oracle Secure Coding Standard for JavaEXP51-JG. Do not perform assignments in conditional expressions
ISO/IEC TR 17961 (Draft)No assignment in conditional expressions [boolasgn]
ISO/IEC TR 24772Likely incorrect expression [KOA]
MITRE CWECWE-480, Use of incorrect operatorISO/IEC TR 17961 (Draft)

Bibliography

[Hatton 1995]Section 2.7.2, "Errors of Omission and Addition"

...