我一直在研究GNU g ++编译器的已编译程序集,它看起来会导致无限循环(g ++ -S file.c -o out的部分输出):

.L3:
        movq    array2(%rip), %rax
        movq    array1(%rip), %rdx
        movq    -8(%rbp), %rcx
        salq    $3, %rcx
        addq    %rcx, %rdx
        movq    (%rdx), %rdx
        andl    $1, %edx
        salq    $3, %rdx
        addq    %rdx, %rax
        movq    (%rax), %rdx
        movq    temp(%rip), %rax
        andq    %rdx, %rax
        movq    %rax, temp(%rip)
        subq    $1, -8(%rbp)
        jmp     .L3


除了最后一个jmp指令以外,所有这些指令都是movq或计算指令,但这仅使我们回到.L3。这是以下代码的主体:

          ull i; // unsigned long long int
          for (i = x - 1; i >= 0; i--)
               temp &= array2[array1[i] & 1];


它如何退出循环?看起来它只是减少了i(subq $ 1,-8(%rbp))并在没有比较的情况下重新启动。

最佳答案

假设ullunsigned long long,则循环永远不会结束,因为:

i >= 0


永远是真的。

注意:g++在启用警告的情况下进行编译时报告此问题。

关于c++ - g++编译的程序集导致无限循环?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53456130/

10-13 07:05