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