#include <cstdio>
__int128 idx;
int main() {
int a[2] = {1, 2};
idx++;
a[idx] = 0;
printf("%d %d", a[0], a[1]);
}
在打开O2之后,没有执行[idx]=0。我想这不应该是未定义的行为。这是编译器中的错误吗?
https://godbolt.org/z/qqccd9oEj
查看gcc-12.1-std=c++20-O2-W-Wall 的编译器输出
.LC0:
.string "%d %d"
main:
sub rsp, 8
mov edx, 2
add QWORD PTR idx[rip], 1
mov esi, 1
adc QWORD PTR idx[rip+8], 0
mov edi, OFFSET FLAT:.LC0
xor eax, eax
call printf
xor eax, eax
add rsp, 8
ret
idx:
.zero 16
问题出在mov edx, 2
上。这是错误的,它应该读取a[1]
并将其优化为0而不是2。
clang做对了,但仍然生成了糟糕的代码。idx
应该得到优化。
您应该将其作为编译器错误进行归档。