Versions Compared

Key

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

...

This noncompliant code example has a typo that results in an assignment rather than a comparison.

Code Block
bgColor#FFcccc
langc
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
bgColor#FFcccc
langc
while ('\t' = ch && ' ' == ch && '\n' == ch) {
  /* ... */
}

Due to the diagnostic, the typo will be easily spotted and fixed.

Code Block
bgColor#ccccff
langc
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
bgColor#ccccff
langc
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
bgColor#ccccff
langc
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
bgColor#FFcccc
langc
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
bgColor#ccccff
langc
if ((v == w) && flag) { /* ... */ }; 

When the assignment is intended, the following controlling expression can be used:

Code Block
bgColor#ccccff
langc
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
bgColor#ccccff
langc
if (foo(x = y)) { /* ... */ } 

 

Risk Assessment

...

Tool

Version

Checker

Description

Clang
Include Page
Clang_V
Clang_V
-WparenthesesCan detect some instances of this rule, but does not detect all
CodeSonar
Include Page
CodeSonar_V
CodeSonar_V
LANG.STRUCT.CONDASSIG
LANG.STRUCT.SE.COND
Assignment in conditional
Condition contains side effects

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

CC2.EXP18
CC2.EXP21

Fully implemented

GCC

Include Page
GCC_V
GCC_V

 

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

Klocwork

Include Page
Klocwork_V
Klocwork_V

ASSIGCOND.GEN
ASSIGCOND.CALL

 

LDRA tool suite

Include Page
LDRA_V
LDRA_V

114 S, 132 S

Enhanced Enforcement
Parasoft C/C++test9.5BD-PB-CC 
Polyspace Bug FinderR2016aInvalid use of = operatorAssignment in control statement
PRQA QA-C
Include Page
PRQA QA-C_v
PRQA QA-C_v
3314, 3326, 3344, 3416Partially implemented
SonarQube C/C++ Plugin
Include Page
SonarQube C/C++ Plugin_V
SonarQube C/C++ Plugin_V
AssignmentInSubExpression 

...