当128位整数被下标时,GCC打开O2会导致错误


#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应该得到优化。

您应该将其作为编译器错误进行归档。

最新更新