- 论坛徽章:
- 0
|
原帖由 shuchi91 于 2009-7-9 11:50 发表 ![]()
25 char *xu;
26 xu=(char *)malloc(100);
27 xu[1000]='x';
28 printf("%c",xu[1000]);
25 char xu[100];
27 xu[1000]='x';
28 printf("%c",xu[1000]);
这两种 ...
上汇编看看 test.c
int main()
{
char xu[100];
xu[1000]='x';
printf("%c\n",xu[1000]);
return 0;
}
gcc -S test.c
cat test.s
main:
pushl %ebp
movl %esp, %ebp
subl $120, %esp ->分配栈空间
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
movb $120, 880(%ebp) 将 'x' 写到 ebp + 880的位置, 减去 -120 ( subl $120, %esp) 刚好是 1000的位置,向地址空间的上面走了
subl $8, %esp
movsbl 880(%ebp),%eax
pushl %eax -> 压入xu[1000] 保存的值 : 'x'
pushl $.LC0 -> 压入"%c"
call printf ->调用printf
addl $16, %esp ->平栈
movl $0, %eax -> return 0
leave
ret
为啥不出错,因为这是个简单程序,如果作为一个普通的函数, 被多层次调用,那么这个危险的动作:
movb $120, 880(%ebp) -> xu[1000]='x'; 就可能破坏调用者的堆栈,导致程序崩溃 |
|