gpt4 book ai didi

c - 有谁知道为什么 gcc 4.8.4 在无限循环中优化这段代码?

转载 作者:太空宇宙 更新时间:2023-11-04 05:09:08 28 4
gpt4 key购买 nike

我发现以下代码未经优化编译和使用-Os 优化编译的汇编程序结果之间的差异非常奇怪。

#include <stdio.h>

int main(){
int i;

for(i=3;i>2;i++);

printf("%d\n",i);

return 0;
}

未经优化的代码结果:

000000000040052d <main>:
40052d: 55 push %rbp
40052e: 48 89 e5 mov %rsp,%rbp
400531: 48 83 ec 10 sub $0x10,%rsp
400535: c7 45 fc 03 00 00 00 movl $0x3,-0x4(%rbp)
40053c: c7 45 fc 03 00 00 00 movl $0x3,-0x4(%rbp)
400543: eb 04 jmp 400549 <main+0x1c>
400545: 83 45 fc 01 addl $0x1,-0x4(%rbp)
400549: 83 7d fc 02 cmpl $0x2,-0x4(%rbp)
40054d: 7f f6 jg 400545 <main+0x18>
40054f: 8b 45 fc mov -0x4(%rbp),%eax
400552: 89 c6 mov %eax,%esi
400554: bf f4 05 40 00 mov $0x4005f4,%edi
400559: b8 00 00 00 00 mov $0x0,%eax
40055e: e8 ad fe ff ff callq 400410 <printf@plt>
400563: b8 00 00 00 00 mov $0x0,%eax
400568: c9 leaveq
400569: c3 retq

输出是:-2147483648(正如我在 PC 上所期望的那样)

使用 -Os 的代码结果:

0000000000400400 <main>:
400400: eb fe jmp 400400 <main>

我认为第二个结果是错误的!!!我认为编译器应该已经编译了一些与代码相对应的东西:

printf("%d\n",-2147483648);

最佳答案

编译器正常工作。

有符号整数溢出在 C 中是非法的,并且会导致未定义的行为。任何依赖它的程序都会被破坏。


编译器将 for(i=3;i>2;i++); 替换为 while(1);,因为它看到 i 从 3 开始,只会增加,所以 value 永远不会小于 3。

只有溢出会导致循环退出。但这是非法的,编译器假定您永远不会做这种肮脏的事情。

因为有无限循环,printf 永远不会到达,可以删除。


未优化的版本只是偶然工作。编译器可以在那里做同样的事情,它同样有效。

关于c - 有谁知道为什么 gcc 4.8.4 在无限循环中优化这段代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32825873/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com