|
发表于 2022-3-6 13:53:06
|
显示全部楼层
clang 和 gcc 都可以有
这两个对C/C++ 中的未定义行为的处理,有好多都不一样
例如 i++ + i++,函数参数求值顺序这些
- $ cat main.c
- #include <stdio.h>
- int main(void) {
- int i = 0;
- printf("%d %d %d %d\n", i++, i++, i++, i++);
- printf("%d %d %d %d\n", ++i, ++i, ++i, ++i);
- i = 0;
- printf("%d\n", i++ + i++ + i++);
- printf("%d\n", ++i + ++i + ++i);
- i = 0;
- i = i++;
- printf("%d\n", i);
- i = 0;
- i = ++i;
- printf("%d\n", i);
- i = 0;
- printf("%d\n", i++ + ++i);
- return 0;
- }
- $ gcc -g -Wall -o main main.c
- main.c: In function ‘main’:
- main.c:5:45: warning: operation on ‘i’ may be undefined [-Wsequence-point]
- 5 | printf("%d %d %d %d\n", i++, i++, i++, i++);
- | ~^~
- main.c:5:45: warning: operation on ‘i’ may be undefined [-Wsequence-point]
- main.c:5:45: warning: operation on ‘i’ may be undefined [-Wsequence-point]
- main.c:6:44: warning: operation on ‘i’ may be undefined [-Wsequence-point]
- 6 | printf("%d %d %d %d\n", ++i, ++i, ++i, ++i);
- | ^~~
- main.c:6:44: warning: operation on ‘i’ may be undefined [-Wsequence-point]
- main.c:6:44: warning: operation on ‘i’ may be undefined [-Wsequence-point]
- main.c:8:27: warning: operation on ‘i’ may be undefined [-Wsequence-point]
- 8 | printf("%d\n", i++ + i++ + i++);
- | ~^~
- main.c:8:27: warning: operation on ‘i’ may be undefined [-Wsequence-point]
- main.c:9:26: warning: operation on ‘i’ may be undefined [-Wsequence-point]
- 9 | printf("%d\n", ++i + ++i + ++i);
- | ^~~
- main.c:9:26: warning: operation on ‘i’ may be undefined [-Wsequence-point]
- main.c:11:7: warning: operation on ‘i’ may be undefined [-Wsequence-point]
- 11 | i = i++;
- | ~~^~~~~
- main.c:14:7: warning: operation on ‘i’ may be undefined [-Wsequence-point]
- 14 | i = ++i;
- | ~~^~~~~
- main.c:17:21: warning: operation on ‘i’ may be undefined [-Wsequence-point]
- 17 | printf("%d\n", i++ + ++i);
- | ~^~
- $ ./main
- 3 2 1 0
- 8 8 8 8
- 3
- 16
- 0
- 1
- 2
- $ clang -g -Wall -o main main.c
- main.c:5:30: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
- printf("%d %d %d %d\n", i++, i++, i++, i++);
- ^ ~~
- main.c:6:29: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
- printf("%d %d %d %d\n", ++i, ++i, ++i, ++i);
- ^ ~~
- main.c:8:21: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
- printf("%d\n", i++ + i++ + i++);
- ^ ~~
- main.c:9:20: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
- printf("%d\n", ++i + ++i + ++i);
- ^ ~~
- main.c:11:10: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
- i = i++;
- ~ ^
- main.c:14:9: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
- i = ++i;
- ~ ^
- main.c:17:21: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
- printf("%d\n", i++ + ++i);
- ^ ~~
- 7 warnings generated.
- $ ./main
- 0 1 2 3
- 5 6 7 8
- 3
- 15
- 0
- 1
- 2
- $
复制代码 |
|