Why is f(i = -1, i = -1) undefined behavior?

前端 未结 11 1663
再見小時候
再見小時候 2020-12-04 05:28

I was reading about order of evaluation violations, and they give an example that puzzles me.

1) If a side effect on a scalar object is un-sequenced r

11条回答
  •  南方客
    南方客 (楼主)
    2020-12-04 06:11

    Since the operations are unsequenced, there is nothing to say that the instructions performing the assignment cannot be interleaved. It might be optimal to do so, depending on CPU architecture. The referenced page states this:

    If A is not sequenced before B and B is not sequenced before A, then two possibilities exist:

    • evaluations of A and B are unsequenced: they may be performed in any order and may overlap (within a single thread of execution, the compiler may interleave the CPU instructions that comprise A and B)

    • evaluations of A and B are indeterminately-sequenced: they may be performed in any order but may not overlap: either A will be complete before B, or B will be complete before A. The order may be the opposite the next time the same expression is evaluated.

    That by itself doesn't seem like it would cause a problem - assuming that the operation being performed is storing the value -1 into a memory location. But there is also nothing to say that the compiler cannot optimize that into a separate set of instructions that has the same effect, but which could fail if the operation was interleaved with another operation on the same memory location.

    For example, imagine that it was more efficient to zero the memory, then decrement it, compared with loading the value -1 in. Then this:

    f(i=-1, i=-1)
    

    might become:

    clear i
    clear i
    decr i
    decr i
    

    Now i is -2.

    It is probably a bogus example, but it is possible.

提交回复
热议问题