堆栈的溢出
来源:互联网 发布:矩阵的秩是矩阵的值么 编辑:程序博客网 时间:2024/06/11 19:49
缓冲区溢出,在我看来可以界定为堆栈溢出。一个程序的运行所占用的内存空间分为三个部分(从内存地址的低端到高端分布):
程序段 :存放程序代码以及只读数据
数据段 :存放程序的静态变量,也就是常量
堆栈段 :函数内部的临时变量,函数调用,参数传递以及动态申请的空间,如为指针申请空间。
基本上,缓冲区的溢出只(不知道这个词是否准确)发生在堆栈段。通常发生这个情况的可能是C语言中的字符操作函数,如strcpy, strcat, vsprintf, sprintf, getchar, gets等。 如:
char szcName[10] = { '/0' };
strcpy( szcName, "how beautiful it is!");
上述两行语句就会导致缓冲区溢出错误。
堆栈是内存中一块连续的块。堆栈寄存器(SP)的指针总是指向堆栈的栈顶,而堆栈的底部是一个固定的地址,在每个操作系统中堆栈的底部是固定的。
堆栈的操作原则是先进后出,支持PUSH和POP操作
,什么是栈溢出?
因为栈一般默认为1-2m,一旦出现死循环或者是大量的递归调用,在不断的压栈过程中,造成栈容量超过1m而导致溢出。
2,解决方案:
方法一:用栈把递归转换成非递归
通常,一个函数在调用另一个函数之前,要作如下的事情:a)将实在参数,返回地址等信息传递给被调用函数保存; b)为被调用函数的局部变量分配存储区;c)将控制转移到被调函数的入口. 从被调用函数返回调用函数之前,也要做三件事情:a)保存被调函数的计算结果;b)释放被调函数的数据区;c)依照被调函数保存的返回地址将控制转移到调用函数.所有的这些,不论是变量还是地址,本质上来说都是"数据",都是保存在系统所分配的栈中的. 那么自己就可以写一个栈来存储必要的数据,以减少系统负担。
方法二:使用static对象替代nonstatic局部对象
在递归函数设计中,可以使用static对象替代nonstatic局部对象(即栈对象),这不仅可以减少每次递归调用和返回时产生和释放nonstatic对象的开销,而且static对象还可以保存递归调用的中间状态,并且可为各个调用层所访问。
方法三:增大堆栈大小值
当创建一个线程的堆栈时,系统将会保留一个链接程序的/STACK开关指明的地址空间区域。但是,当调用CreateThread或_beginthreadex函数时,可以重载原先提交的内存数量。这两个函数都有一个参数,可以用来重载原先提交给堆栈的地址空间的内存数量。如果设定这个参数为0,那么系统将使用/STACK开关指明的已提交的堆栈大小值。后面将假定我们使用默认的堆栈大小值,即1MB的保留区域,每次提交一个页面的内存。
- 堆栈溢出 的现象,
- 堆栈的溢出
- 堆栈的缓冲区溢出
- 堆栈溢出的原因
- 堆栈溢出的原因
- 堆栈溢出的原因
- 一个堆栈溢出的例子
- PerlRegex堆栈溢出的问题
- ASP 堆栈溢出的解决方法
- 堆栈溢出的攻击实现
- 堆栈溢出的预防方法
- VS 堆栈溢出的解决方案
- 检测内核的堆栈溢出
- 一次堆栈溢出的分析
- 一次堆栈溢出的分析
- 堆栈溢出的常见情况
- 检查堆栈溢出的实验
- 检测内核的堆栈溢出
- 试卷2
- Jsp+Servlet+Commons-Upload实现无刷新文件上传到MySql表存为Blob格式,及个人心得
- 淘宝API开发(一) 简单的用TOPAPI来获取淘宝用户信息
- SQL SERVER 2000 日志文件清理
- 抽象工厂(Abstract Factory)
- 堆栈的溢出
- MFC 非模态,无内存泄漏对话框应该是怎么创建
- 第四章 Servlet技术
- 最简单实现获取当前系统时间的方法
- android_xml解析之 使用PULL读取XML文件 .
- 设置ECLIPSE插件注意目录的结构
- 咨询学习资料汇总
- SQL top 查询出错 第 1 行: '(' 附近有语法错误。
- 2.6.18内核移植成功