[英]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 后未執行。 我想這不應該是未定義的行為。 這是編譯器中的錯誤嗎?
查看 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.