我一直在研究GNU的g ++编译器的已编译程序集,它看起来会导致无限循环(g ++ -S file.c -o out的部分输出):
javascript
除了最后一个jmp指令外,所有这些指令都是movq或计算指令,但这仅使我们回到.L3。这是以下代码的正文:
.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
它如何退出循环?看起来它只是减少了i(subq $ 1,-8(%rbp)),然后在没有比较的情况下重新启动。
答案 0 :(得分:4)
假设ull
是unsigned long long
,则循环永远不会结束,因为:
i >= 0
永远是真的。
注意:g++
在启用警告的情况下进行编译时会报告此问题。