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

pla*_*let 6 c++ gcc

#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 不执行。我想这不应该是未定义的行为。这是编译器中的错误吗?

https://godbolt.org/z/qqccd9oEj

Gos*_*low 5

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

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