免费注册 查看新帖 |

Chinaunix

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

[C] 内存越界访问导致段错误,但是有的机子报有的不报 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-29 14:22 |只看该作者 |倒序浏览
char*p=malloc(100);
for( i=20;i<100;i++ )
    p[i]=p[i+10];
这是明显的内存访问越界,这段代码部署在了10几台服务器上,只有一台肯定报错,其他的服务器却从来没出现过内存访问越界引发的段错误。


我只是想知道为什么?   这些服务器的系统都不是我配的,不过好像是RH的,我想问问这个错误是可以  “选择性”  被系统屏蔽吗?难道有地方可以配置? 求教

论坛徽章:
0
2 [报告]
发表于 2011-06-29 14:26 |只看该作者
这种代码根本无法使用讨论起来没什么意思,
而且段错误还得看运气好坏。

论坛徽章:
0
3 [报告]
发表于 2011-06-29 14:28 |只看该作者
不管是栈还是堆,都是按一定粒度增长的。如果在C语言中对数组越界访问,访问地址可能还在此进程已申请的的地址空间内,所以不会发生segment fault。

这段是从别的地方cp来的  ,他说的对吗?

论坛徽章:
0
4 [报告]
发表于 2011-06-29 14:38 |只看该作者
这种代码根本无法使用讨论起来没什么意思,
而且段错误还得看运气好坏。
int-main 发表于 2011-06-29 14:26



    我一开始也觉得是运气,但是总不能一台机子绝对报错,其他的机子完全不抱错吧。


难道执行的频繁度还不够?   安全起见还是都改了吧,谢谢

论坛徽章:
0
5 [报告]
发表于 2011-06-29 15:00 |只看该作者
如果读了不可读或写了不可写的内存就报错,否则就算越界了也不报错

论坛徽章:
0
6 [报告]
发表于 2011-06-29 16:37 |只看该作者
不管是栈还是堆,都是按一定粒度增长的。如果在C语言中对数组越界访问,访问地址可能还在此进程已申请的的地 ...
houtinghua 发表于 2011-06-29 14:28



差不多就这原因了

论坛徽章:
0
7 [报告]
发表于 2011-06-29 17:36 |只看该作者
一般malloc(size)都会分配比size大的内存块。

论坛徽章:
0
8 [报告]
发表于 2011-06-29 17:41 |只看该作者
楼主还没有了解SEGMENT FAULT 的本质

论坛徽章:
0
9 [报告]
发表于 2012-04-11 14:44 |只看该作者
本帖最后由 glmwu 于 2012-04-11 14:45 编辑

进城的堆空间也是以每页大小进行映射的,在malloc时,如果申请的大小加上原来的位置brk指针,没超过当前映射的页边界,就只是简单的修改brk的值,如果超出,才进行缺页异常处理。
使用malloc的空间时,会存在虽然超出brk指针,但使用位置仍在该页映射的虚拟地址空间内,便不会产生segment fault。

   

论坛徽章:
0
10 [报告]
发表于 2012-11-27 15:29 |只看该作者
我现在集中回复我以前发的SB帖子,我错了,我n年前太菜了,让大家见笑了



现在依然是似懂非懂
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP