在调用退出函数后,对 printf 的调用不会出现在反汇编中
Call to printf doesn't show up in disassembly after a call to exit function
#include <stdio.h>
#include <stdlib.h>
int main()
{
exit(0);
printf("%s\n", "Nice");
}
我想知道是否有可能禁用任何不会生成调用 printf 的指令的东西,如果它被放置在退出调用之后。
我在用着
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.4)
编译时没有标志。我试过使用-O0,但反汇编没有任何变化。
0x000000000040052d <+0>: push %rbp
0x000000000040052e <+1>: mov %rsp,%rbp
0x0000000000400531 <+4>: mov [=11=]x0,%edi
0x0000000000400536 <+9>: callq 0x400430 <exit@plt>
exit()
在 <stdlib.h>
中定义为永不返回其调用者:
_Noreturn void exit(int status);
编译器利用了这一点,不会为从未到达的语句生成代码。如果您通过 -Wall
以获得更多诊断,您将收到有关此的警告。
#include <stdio.h>
#include <stdlib.h>
int main()
{
exit(0);
printf("%s\n", "Nice");
}
我想知道是否有可能禁用任何不会生成调用 printf 的指令的东西,如果它被放置在退出调用之后。
我在用着
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.4)
编译时没有标志。我试过使用-O0,但反汇编没有任何变化。
0x000000000040052d <+0>: push %rbp
0x000000000040052e <+1>: mov %rsp,%rbp
0x0000000000400531 <+4>: mov [=11=]x0,%edi
0x0000000000400536 <+9>: callq 0x400430 <exit@plt>
exit()
在 <stdlib.h>
中定义为永不返回其调用者:
_Noreturn void exit(int status);
编译器利用了这一点,不会为从未到达的语句生成代码。如果您通过 -Wall
以获得更多诊断,您将收到有关此的警告。