UOJ Logo zhaojinxi的博客

博客

疑似编译器bug

2024-03-08 20:26:34 By zhaojinxi

代码(C++14):

#include <cstdio>
struct Node {
    int x;
};
Node f(int A, int B) {
    if (A < 0) return {0};
    return {A / B + (A % B != 0)};
}
Node g(int C, int D) {
    if (C > 0) return {0};
    return {C / D + (C % D != 0)};
}
int main() {
    int n;
    scanf("%d", &n);
    f(1, 1);
    Node t = g(-1, n);
    printf("%d\n", t.x);
}

输入:

2

输出:

1

以上代码在使用 GCC 9.2 及以上版本编译并开启 O2 优化时输出 0,不开 O2 优化时运行结果正常,使用 Clang 编译时运行结果正常。

注意到 GCC 9.2 没有为 C % D != 0 生成相应的汇编代码:

GCC 9.1 编译结果

GCC 9.2 编译结果

@@ -19,12 +19,8 @@
     ret
 .L7:
     mov     eax, edi
-    xor     edi, edi
     cdq
     idiv    esi
-    test    edx, edx
-    setne   dil
-    add     eax, edi
     ret
 .LC0:
     .string "%d"
@@ -37,13 +33,10 @@
     lea     rsi, [rsp+12]
     call    __isoc99_scanf
     mov     eax, -1
-    xor     esi, esi
     mov     edi, OFFSET FLAT:.LC1
     cdq
     idiv    DWORD PTR [rsp+12]
-    test    edx, edx
-    setne   sil
-    add     esi, eax
+    mov     esi, eax
     xor     eax, eax
     call    printf
     xor     eax, eax

问题来源:关于语言类型 - 洛谷

zhaojinxi Avatar