gcc的返回值

当使用GCC编译器不加-Wall参数且函数无返回语句时,虽然编译正常,但返回值是不确定的。汇编代码显示,调用者通常通过eax寄存器获取返回值。在这种情况下,func函数的返回值在未明确设置时,会导致main函数接收到随机数据。这可能会引发不可预期的行为,应当避免。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不加-Wall参数的情况或多路返回情况下,gcc默认不对未写返回语句的情况作处理。如:

int func()

{

}

int main(void)

{

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

}

编译正常。

一般来说,如果返回值在四个字节以内,就会使用eax寄存器返回。而return语句就是将返回值写入eax。调用者到eax寄存器中取返回值。

因此,在缺失return语句时,返回值是不确定的,危险


汇编代码如下:

(gdb) disassemble main
Dump of assembler code for function main:
   0x08048421 <+0>:    push   %ebp
   0x08048422 <+1>:    mov    %esp,%ebp
   0x08048424 <+3>:    and    $0xfffffff0,%esp
   0x08048427 <+6>:    sub    $0x10,%esp
   0x0804842a <+9>:    call   0x804841c <func>
   0x0804842f <+14>:    mov    %eax,0x4(%esp)-------------------取func的返回值
   0x08048433 <+18>:    movl   $0x80484e0,(%esp)
   0x0804843a <+25>:    call   0x80482f0 <printf@plt>
   0x0804843f <+30>:    mov    $0x0,%eax----------------------------main函数的返回值
   0x08048444 <+35>:    leave  
   0x08048445 <+36>:    ret    
End of assembler dump.

(gdb) disassemble func
Dump of assembler code for function func:
   0x0804841c <+0>:    push   %ebp
   0x0804841d <+1>:    mov    %esp,%ebp
   0x0804841f <+3>:    pop    %ebp
   0x08048420 <+4>:    ret-------------------------------------------------返回之前,未写返回值   
End of assembler dump.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值