You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

The order of evaluation of subexpressions, and the order in which side effects take place, are frequently defined as unspecified behavior by C99. Counter intuitively, unspecified behavior is where the standard provides two or more possibilities and imposes no further requirements on which is chosen in any instance.

According to C99, Section 6.5, "Expressions":

Except as specified later (for the function-call (), &&, ||, ?:, and comma operators), the order of evaluation of subexpressions and the order in which side effects take place are both unspecified.

Non-Compliant Code Example

Programs cannot safely rely on the order of evaluation of operands between sequence points. In this non-compliant code example, the order of evaluation of the operands to the + operator is unspecified.

int g;

int f(int i) {
  g = i;
  return 0;
}

int main(void) {
  int x = f(1) + f(2); /* Line B */ 
  /* ... */
  return 0;
}

This code may result in g being assigned the value 1, or equally likely, being assigned the vlaue 2.

Compliant Solution

These examples are independent of the order of evaluation of the operands and can only be interpreted in one way.

int g;

int f(int i) {
  g = i;
  return 0;
}

int main(void) {
  int x = f(1); 
  x += f(2);
  /* ... */
  return 0;
}

This code always results in g being assigned the value 2.

Risk Assessment

Rule

Severity

Likelihood

Remediation Cost

Priority

Level

EXP10-A

2 (medium)

2 (probable)

2 (medium)

P8

L2

Related Vulnerabilities

Search for vulnerabilities resulting from the violation of this rule on the CERT website.

References

[[ISO/IEC 9899-1999]] Section 5.1.2.3, "Program execution," Section 6.5, "Expressions," and Annex C, "Sequence points"
[[ISO/IEC PDTR 24772]] "JCW Operator precedence/Order of Evaluation" and "SAM Side-effects and order of evaluation"
[[MISRA 04]] Rule 12.1
[[Summit 05]] Questions 3.1, 3.2, 3.3, 3.3b, 3.7, 3.8, 3.9, 3.10a, 3.10b, and 3.11
[[Saks 07]]


DCL13-A. Function arguments that are pointers to values not changed by the function should be declared const      03. Expressions (EXP)       EXP31-C. Do not modify constant values

  • No labels