[ The Types Forum, http://lists.seas.upenn.edu/mailman/listinfo/types-list ]

Hello Uday,

On 04/23/2013 08:32 PM, Uday S Reddy wrote:
In the C standard, the order of evaluation of arguments in function calls is
unspecified.  However, if I were stupid enough to depend on a particular
evaluation order that my compiler chooses deterministically, I would have
hidden bugs in my programs that I wouldn't be able to notice.  If I paid
good money for a C compiler, I would definitely demand that it should have
an option to randomize the evaluation order of arguments.

Let me then notice that in the case of C, it is worse than just non-determinism. There are also so called sequence point violations, which happen if you modify an object more than once (or read after you've modified it) in between two sequence points. For example

  int x = 0;
  int main() {
    printf("%d ", (x = 3) + (x = 4));
    printf("%d\n", x);
    return 0;
  }

not just randomly prints "7 3" or "7 4", but instead gives rise to undefined behavior, and could print arbitrary nonsense. When compiled with gcc at my machine, it for example prints "8 4".

In fact, at least in one case, I would welcome a compiler that does that.

If you would like to explore non-determinism in C, you should take a look at the executable C semantics by Chucky Ellison and Grigore Rosu

  http://code.google.com/p/c-semantics/

It provides an interpreter that can used for exactly what you want to do. Also the interpreter of CompCert is also able to explore all possible evaluation orders. A patch by me

  http://gallium.inria.fr/blog/non-determinism-and-sequence-points-in-c/

allows it also to be used to detect sequence point violations as well.

Best,

Robbert

Reply via email to