簡體   English   中英

GCC 開啟 O2 會導致 128 位 integer 下標時出現錯誤

[英]GCC turning on O2 causes bug when 128-bit integer is subscripted

#include <cstdio>

__int128 idx;

int main() {
    int a[2] = {1, 2};
    idx++;
    a[idx] = 0;
    printf("%d %d", a[0], a[1]);
}

開啟 O2 a[idx] = 0 后未執行。 我想這不應該是未定義的行為。 這是編譯器中的錯誤嗎?

https://godbolt.org/z/qqccd9oEj

查看 gcc-12.1 -std=c++20 -O2 -W -Wall 的編譯器 output

.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應該得到優化。

您應該將其歸檔為編譯器錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM