Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does this code in C fall into the Undefined Behavior category?

a is an array, foo is a function, and i is an int.

a[++i] = foo(a[i-1], a[i]);

Would the code above, have an Undefined Behavior?

The array indices ++i, i-1 and i, are guaranteed to be in the array range.

like image 212
Bite Bytes Avatar asked Aug 21 '17 18:08

Bite Bytes


1 Answers

The behavior is undefined, but it's not because of the modification of the same object twice between two sequence points but it is UB because the side effect on i is unsequnced relative to the value computation of a[i-1] and a[i] using i.

§6.5-p(2):

If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined. If there are multiple allowable orderings of the subexpressions of an expression, the behavior is undefined if such an unsequenced side effect occurs in any of the orderings.84)

For example, expression

a[i++] = i;

invokes undefined behavior. Same is true for

a[++i] = foo(a[i-1], a[i]);
like image 146
haccks Avatar answered Sep 20 '22 13:09

haccks