免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9769 | 回复: 14
打印 上一主题 下一主题

栈溢出问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-13 01:48 |只看该作者 |倒序浏览
分配局部变量的时候分配了一个相当大的局部变量(char buf[65535]),当我指定了-fstack-check编译选项之后就出现SIGSEGV,如果不指定-fstack-check的话又会变得相当不稳定-这里相当不稳定的意思指的是程序在某一段时间CPU占用率会突然升高或者是某过一段时间就会没有响应
由于大量的代码都是这样改起来很麻烦,请问各位高手有没有办法可以解决这个问题?

[ 本帖最后由 bassini 于 2007-8-13 01:50 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2007-08-13 08:03 |只看该作者
编译时还应该调整栈的尺寸吧?

论坛徽章:
0
3 [报告]
发表于 2007-08-13 09:18 |只看该作者
一些编译器会检查你的栈上面的变量是否过大,为啥呢?是因为每个操作系统分配给每个线程的栈是有个缺省大小的,如果一个线程占用的栈过大,可能会"污染"到其他的线程。

所以建议是坚决不要使用过大的局部变量。我不太明白很多人喜欢用栈的原因,有些人认为局部变量的效率高。我可以很负责任的高速大家,在一些操作系统上,未必 。上面这位老兄的 CPU 使用率陡然上升就是证明。

根据你的描述,我怀疑这个问题可能不是编译的时候调整栈的尺寸,或者创建线程的时候调整栈的尺寸能够解决的。

论坛徽章:
0
4 [报告]
发表于 2007-08-13 09:31 |只看该作者
为什么不malloc出来??
假设可以产生递归调用序列...不是很快就死了??

论坛徽章:
0
5 [报告]
发表于 2007-08-13 11:41 |只看该作者
栈的空间毕竟有限,大数据还是用堆吧。

论坛徽章:
0
6 [报告]
发表于 2007-08-13 12:26 |只看该作者
原帖由 flw 于 2007-8-13 08:03 发表
编译时还应该调整栈的尺寸吧?

编译时怎么调栈尺寸啊?

论坛徽章:
0
7 [报告]
发表于 2007-08-13 12:30 |只看该作者
原帖由 0521 于 2007-8-13 09:18 发表
一些编译器会检查你的栈上面的变量是否过大,为啥呢?是因为每个操作系统分配给每个线程的栈是有个缺省大小的,如果一个线程占用的栈过大,可能会"污染"到其他的线程。

所以建议是坚决不要使用过大的局部变量 ...


我也想把他全部改成堆,可是成千上万个函数都是这样.............

论坛徽章:
0
8 [报告]
发表于 2007-08-13 12:38 |只看该作者
你的程序是不是从其他的操作系统上移植过来的?

论坛徽章:
0
9 [报告]
发表于 2007-08-13 12:39 |只看该作者
原帖由 0521 于 2007-8-13 12:38 发表
你的程序是不是从其他的操作系统上移植过来的?

不是,本来就是LINUX的,只是代码比较旧,都是以前的人写下来的了

论坛徽章:
0
10 [报告]
发表于 2007-08-13 12:46 |只看该作者
局部变量开到64K,的确不可想象,如果这个函数再来个递归,楼主死定了。
如果不是怀疑buffer本身溢出,建议用boost::array类替换看,它可以查出buffer越界。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP