虽然基思的回答符合我的问题的精神,但是根据Alex的要求,我想我会为自己尝试一下。
有趣的是,在这种情况下,我的例子中更多的文字回答是“垃圾”。
#include <stdio.h>
int iMysteryMeat(short x)
{
return *((int *)&x);
}
unsigned uMysteryMeat(unsigned short x)
{
return *((unsigned *)&x);
}
int main()
{
printf("iMeat: 0x%08x\n", iMysteryMeat(-23));
printf("uMeat: 0x%08x\n", uMysteryMeat(-23));
return 0;
}
gcc -m32 -S meat.c
iMysteryMeat:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %eax
movw %ax, -4(%ebp)
leal -4(%ebp), %eax
movl (%eax), %eax
leave
ret
uMysteryMeat:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %eax
movw %ax, -4(%ebp)
leal -4(%ebp), %eax
movl (%eax), %eax
leave
ret
./a.out
iMeat: 0x0804ffe9
uMeat: 0x0043ffe9
正如你所看到的,不仅是overrided通常的符号扩展协议(即Keith的a()
比较),它实际上使X为未初始化的堆栈空间movw
,使返回值垃圾的上半部分不管什么main()
都给它。
所以,再次,作为ouah说,永远为此在C和汇编(或一般,真的),总是消毒您输入。
来源
2012-09-05 23:08:17
bug
使用gcc -S然后回来告诉我们! –
你的问题与ELF无关 – TJD
你是对的。这与黑暗中的一枪相同。 – bug