4 ms·
Is this example non-deterministic or just undefined? Sure you should not rely on this code to give you consistent results between compilers and even optimisatio
by danieltillett 10y ago
Is this example non-deterministic or just undefined? Sure you should not rely on this code to give you consistent results between compilers and even optimisation levels, but what ever happens should be consistent between runs.
- gravypod 10y agoThis is UB and it's caught by both GCC and Clang: $ gcc -Wall test.c test.c: In function ‘main’: test.c:12:13: warning: operation on ‘a’ may be undefined [-Wsequence-point] test(a++, a++); ~^~ $ clang test.c test.c:12:8: warning: multiple unsequenced modifications to 'a' [-Wunsequenced] test(a++, a++); ^ ~~ 1 warning generated.
- danieltillett 10y agoExactly. The OP asked for an example of a non- deterministic function not UB.
- fmap 10y agoI'm not sure about non-deterministic behavior without looking it up, but you can fix this example to be implementation defined, rather than undefined like this: #include <stdio.h> int postincrement(int *x) { int y = *x; *x = y + 1; return y; } int main(int argc, char **argv) { int i = 0; printf("%d, %d\n", postincrement(&i), postincrement(&i)); return 0; } The point is that function arguments introduce sequence points, but the specification for i++ is weaker than what you get for a function call. C is full of gotchas like this...
- pasquinelli 10y agoTheir term was non-deterministic, but they asked for undefined behavior, because they were asking for examples of course being not fully defined semantically.
- Keyframe 10y agoExactly! Without sequence-point error, output is 1,0 on GCC6, 0,1 with CLang.
- metaobject 10y agoIt's interesting that GCC requires -Wall whereas clang issues the warning by default. I wonder how many "bugs" could be caught early if GCC just issued the warning by default as well (for folks who don't religiously use -Wall)?