#include <cstdio>
__int128 idx;
int main() {
int a[2] = {1, 2};
idx++;
a[idx] = 0;
printf("%d %d", a[0], a[1]);
}
Run Code Online (Sandbox Code Playgroud)
打开 O2 后,a[idx] = 0 不执行。我想这不应该是未定义的行为。这是编译器中的错误吗?
查看 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
Run Code Online (Sandbox Code Playgroud)
问题是mov edx, 2。这是错误的,它应该读取a[1]并优化为 0 而不是 2。
clang 是正确的,但仍然生成可怕的代码。idx应该得到优化。
您应该将其归档为编译器错误。