3 ms·
This 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 un
by gravypod 10y ago
This 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)?