分类: C/C++
2012-03-08 10:50:14
最近在调查内存泄漏和程序不定期crash的问题,其中有一个横展开观点是:
对数组越界写入导致破坏程序堆栈导致的crash.原因是什么,首先必须了解内存的布局,如下图:
自底向上,内存中依次存放着只读的程序代码和数据,全局变量和静态变量,堆中的动态申请变量和堆栈中的自动变量。
自动变量就是在函数内声明的局部变量。当函数被调用时,它们被压入栈;当函数返回时,它们就要被弹出堆栈。
堆栈的使用基本上由系统控制,用户一般不会直接对其进行控制,所以堆栈的使用还是相对安全的。
动态内存是一柄双刃剑:它可以提供程序员更灵活的内存使用方法,而且有些算法没有动态内存会很难实现;但是动态内存往往是内存问题存在的沃土。
而数组越界写入就是破坏堆栈的原因之一:
1、入口参数是在栈底(内存高位)附近(函数的返回地址也在附近)
2、数组的存放是从内存低位向高位存放。所以,如果数组大小是4字节,如果越界写入,就会向上破坏相邻高位内存中保存的数据,可能是前面的局部变量,当越界写入内容足够多,就会破坏栈底保存的函数的返回地址,直接导致函数返回时发生crash.