我一直在研究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))并在没有比较的情况下重新启动。
最佳答案
假设ull
是unsigned long long
,则循环永远不会结束,因为:
i >= 0
永远是真的。
注意:
g++
在启用警告的情况下进行编译时报告此问题。关于c++ - g++编译的程序集导致无限循环?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53456130/