免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wzabcd1234
打印 上一主题 下一主题

[C] 内存中是否有不可读的区域 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2009-07-28 14:07 |只看该作者
好像是printf()函数那边出了点错误吧,把p改为p+i,我试了一下,是可以正常运行的。
#include <stdio.h>

int main()
{
        char *p = "abcd";
        int i = 0;
        for (i = 0; i < 10000; i++) {
                printf("p[%d] = %d\n", i, p+i);
        }
}

论坛徽章:
0
22 [报告]
发表于 2009-07-28 14:25 |只看该作者
p\[i\] = 整数??

[ 本帖最后由 ddgfff 于 2009-7-28 14:26 编辑 ]

论坛徽章:
0
23 [报告]
发表于 2009-07-28 14:27 |只看该作者

回复 #21 混沌时代 的帖子

printf("p[%d] = %d\n", i, p+i);
这里只是打印了p+i的地址吧,这是可以的,但是*(p+i)就会core了。

论坛徽章:
0
24 [报告]
发表于 2009-07-28 14:29 |只看该作者

回复 #22 ddgfff 的帖子

我也不知道p[ i ]是什么类型了,因为已经越界了。。
我用%c, %d, %x都试过了,还是会core的。

论坛徽章:
0
25 [报告]
发表于 2009-07-28 14:32 |只看该作者
感觉不太像是printf的问题,我的原始程序是这样:
#include <memory.h>

int main(){
   char a[10000];
   char *p = "132434";

   memcpy(a, p, sizeof(a));
   printf("%s\n",a);
}

这里memcpy会coredump。

论坛徽章:
0
26 [报告]
发表于 2009-07-28 14:56 |只看该作者
使用coreadm,打开coredump开关,当进程coredump之后,会在指定目录下生成coredump文件,使用gdb或者mdb可以查看coredump文件中的栈顶函数即可断定是coredump在哪个函数里了。

论坛徽章:
0
27 [报告]
发表于 2009-07-28 15:27 |只看该作者

回复 #26 foolishx 的帖子

恩,是core在memcpy上了。
Segmentation fault in . at 0xf454
0x000000000000f454 warning: Unable to access address 0xf454 from core
(dbx) where
.() at 0xf454
main(), line 7 in "a.c"

论坛徽章:
0
28 [报告]
发表于 2009-07-28 15:35 |只看该作者
AIX没接触过,但是linux是不能读越界的,否则会段错误
从你的信息来看AIX明显也是不允许读越界,这是很正常的保护措施啊,有什么好奇怪的呢?

论坛徽章:
0
29 [报告]
发表于 2009-07-28 15:38 |只看该作者

回复 #28 peimichael 的帖子

你好,我是想不大明白,为什么读越界也会core。读越界有什么危害嘛?

论坛徽章:
0
30 [报告]
发表于 2009-07-28 15:44 |只看该作者
比如内核里面有一些重要隐私数据(比如其他用户的密码),如果可以读越界,
因为内核空间是公用的,那么就可以获取内核空间的这些数据,当然有危害。
内核甚至在给用户空间分配页的时候都会将它赋成0,防止以前残留的数据被用户获取,
当然更要防止用户直接读到正在使用的数据了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP