Chinaunix首页 | 论坛 | 博客
  • 博客访问: 135333
  • 博文数量: 40
  • 博客积分: 673
  • 博客等级: 上士
  • 技术积分: 426
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-21 14:08
文章分类

全部博文(40)

文章存档

2013年(4)

2012年(36)

我的朋友

分类: C/C++

2012-03-08 10:50:14

最近在调查内存泄漏和程序不定期crash的问题,其中有一个横展开观点是:

对数组越界写入导致破坏程序堆栈导致的crash.原因是什么,首先必须了解内存的布局,如下图:


自底向上,内存中依次存放着只读的程序代码和数据,全局变量和静态变量,堆中的动态申请变量和堆栈中的自动变量。

自动变量就是在函数内声明的局部变量。当函数被调用时,它们被压入栈;当函数返回时,它们就要被弹出堆栈。

堆栈的使用基本上由系统控制,用户一般不会直接对其进行控制,所以堆栈的使用还是相对安全的。

动态内存是一柄双刃剑:它可以提供程序员更灵活的内存使用方法,而且有些算法没有动态内存会很难实现;但是动态内存往往是内存问题存在的沃土。

而数组越界写入就是破坏堆栈的原因之一:

1、入口参数是在栈底(内存高位)附近(函数的返回地址也在附近)

2、数组的存放是从内存低位向高位存放。所以,如果数组大小是4字节,如果越界写入,就会向上破坏相邻高位内存中保存的数据,可能是前面的局部变量,当越界写入内容足够多,就会破坏栈底保存的函数的返回地址,直接导致函数返回时发生crash.

阅读(1961) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

小尾巴鱼1211212012-03-09 00:08:56

这个真的一定要注意啊!