雖然基思的回答符合我的問題的精神,但是根據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