免费注册 查看新帖 |

Chinaunix

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

core dump系列分析之1----高手请进 [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-05-15 11:24 |只看该作者 |倒序浏览
这个问题大概有95%的人不能答对,请看看下面两组例子代码,然后回答两个问题:

1、解释为什么第一组代码会core dump,第二组却不会core dump?

2、解释为什么各个系统之之间存在这种差别?


--------例程代码段1---------
如下代码会发生core dump.

AIX环境请用如下代码测试

  1. #include <stdio.h>;
  2. #include <unistd.h>;

  3. int main(void)
  4. {
  5.     unsigned long i = 0;
  6.     char     buf[8000];
  7.     char     *ptr = NULL;

  8.     ptr = (char *)malloc( sizeof( buf ) );
  9.     if(ptr == NULL ) {
  10.         perror("malloc");
  11.         exit(-1);
  12.     }
  13.     for( i  = 0; i < (sizeof( buf ) + 128 ); i ++ ) ptr[i] = 1;
  14.     free(ptr);
  15.     exit(0);
  16. }
复制代码

HP UNIX环境请用如下代码测试

  1. #include <stdio.h>;
  2. #include <unistd.h>;

  3. int main(void)
  4. {
  5.     unsigned long i = 0;
  6.     char     buf[8000];
  7.     char     *ptr = NULL;

  8.     ptr = (char *)malloc( sizeof( buf ) );
  9.     if(ptr == NULL ) {
  10.         perror("malloc");
  11.         exit(-1);
  12.     }
  13.     for( i  = 0; i < (sizeof( buf ) + 12300 ); i ++ ) ptr[i] = 1;
  14.     free(ptr);
  15.     exit(0);
  16. }
复制代码

SCO UNIX环境请用如下代码测试

  1. #include <stdio.h>;
  2. #include <unistd.h>;

  3. int main(void)
  4. {
  5.     unsigned long i = 0;
  6.     char     buf[8000];
  7.     char     *ptr = NULL;

  8.     ptr = (char *)malloc( sizeof( buf ) );
  9.     if(ptr == NULL ) {
  10.         perror("malloc");
  11.         exit(-1);
  12.     }
  13.     for( i  = 0; i < (sizeof( buf ) + 2850 ); i ++ ) ptr[i] = 1;
  14.     free(ptr);
  15.     exit(0);
  16. }
复制代码




--------例程代码段2---------
如下代码不会发生core dump

AIX环境请用如下代码测试

  1. #include <stdio.h>;
  2. #include <unistd.h>;

  3. int main(void)
  4. {
  5.     unsigned long i = 0;
  6.     char     buf[8000];
  7.     char     *ptr = NULL;

  8.     ptr = (char *)malloc( sizeof( buf ) );
  9.     if(ptr == NULL ) {
  10.         perror("malloc");
  11.         exit(-1);
  12.     }
  13.     for( i  = 0; i < (sizeof( buf ) + 4 ); i ++ ) ptr[i] = 1;
  14.     free(ptr);
  15.     exit(0);
  16. }
复制代码

HP UNIX环境请用如下代码测试

  1. #include <stdio.h>;
  2. #include <unistd.h>;

  3. int main(void)
  4. {
  5.     unsigned long i = 0;
  6.     char     buf[8000];
  7.     char     *ptr = NULL;

  8.     ptr = (char *)malloc( sizeof( buf ) );
  9.     if(ptr == NULL ) {
  10.         perror("malloc");
  11.         exit(-1);
  12.     }
  13.     for( i  = 0; i < (sizeof( buf ) + 12200 ); i ++ ) ptr[i] = 1;
  14.     free(ptr);
  15.     exit(0);
  16. }
复制代码

SCO UNIX环境请用如下代码测试

  1. #include <stdio.h>;
  2. #include <unistd.h>;

  3. int main(void)
  4. {
  5.     unsigned long i = 0;
  6.     char     buf[8000];
  7.     char     *ptr = NULL;

  8.     ptr = (char *)malloc( sizeof( buf ) );
  9.     if(ptr == NULL ) {
  10.         perror("malloc");
  11.         exit(-1);
  12.     }
  13.     for( i  = 0; i < (sizeof( buf ) + 2048 ); i ++ ) ptr[i] = 1;
  14.     free(ptr);
  15.     exit(0);
  16. }
复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-05-15 12:47 |只看该作者

core dump系列分析之1----高手请进

自己up一下!

论坛徽章:
0
3 [报告]
发表于 2003-05-15 12:54 |只看该作者

core dump系列分析之1----高手请进

内厚访问越界

另外malloc多少并不是说只会malloc多少,
而是说保证你肯定会有这么多内存可用,如果从系统内存中分配不出这么多内存,那么报错(返回NULL),
但是也可能会分配比你想要的多的内存(多多少由系统决定,而且是随机的)

所以写程序时要访问多少内存就申请多少内存
不要希望能够使用系统多分配的内存

论坛徽章:
0
4 [报告]
发表于 2003-05-15 13:06 |只看该作者

core dump系列分析之1----高手请进

只要遵守纪律,就不会犯错误。
人生也是如此,只不过比编程有更复杂的规则!!
哎。。。。

论坛徽章:
0
5 [报告]
发表于 2003-05-15 13:07 |只看该作者

core dump系列分析之1----高手请进

赞同楼上的观点,
    我也遇到过同样的问题,不过当时时间比较紧,没有仔细研究而已。
   在windows下同样存在这样的问题,如果使用的内存大于malloc分配的内存时,使用的时候是不会报错的,只是导致malloc返回的指针内容发生越界,最后在Free的时候总是会Core dump的。

论坛徽章:
0
6 [报告]
发表于 2003-05-15 13:11 |只看该作者

core dump系列分析之1----高手请进

neither group1 nor group2 codes are  acceptable!!!

I never heard that we can  read/write  to an unknown  memory,
though group2 doesn't core dump, but the code is incorrect! we
should not write such code. any tool such as purify will report
ABW(Array Boundary write) like message.

To coredump or not depend on how memory allocation/management
is implemented in system. It's meaningless to discuss it  in C/C++ group,
it should be a good topic for BSD/Linux/Solaris/AIX groups.

Thanks!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2003-05-15 13:15 |只看该作者

core dump系列分析之1----高手请进

感谢无双兄的提醒,我将代码做了对malloc返回的判断,这样保证分配是成功的,也就是说系统内存是足够的。


大家说了程序设计中需要留意的东西,也说了这种使用方式是不安全的,可能(注意是可能)导致core dump。但是问题的根源在哪里那?

论坛徽章:
0
8 [报告]
发表于 2003-05-15 13:22 |只看该作者

core dump系列分析之1----高手请进

不知对不对.  不过,高人也。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2003-05-15 13:24 |只看该作者

core dump系列分析之1----高手请进

回cs兄,如上两组例程特意写是不安全的,但是有目的的,包括在for循环中每个条件的选择都是甚重考虑的。

这么做,最终为了让大家明白这些unix系统中对于存储器是如何管理的,应用为什么会必然发生core dump,为什么有的程序只是偶尔dump。

如上是讨论1,这个结束了将讨论2:
不同的core之间的差异,这种差异最终是由操作系统的什么措施引起的。

论坛徽章:
0
10 [报告]
发表于 2003-05-15 13:37 |只看该作者

core dump系列分析之1----高手请进

原帖由 "蓝色键盘" 发表:
回cs兄,如上两组例程特意写是不安全的,但是有目的的,包括在for循环中每个条件的选择都是甚重考虑的。

这么做,最终为了让大家明白这些unix系统中对于存储器是如何管理的,应用为什么会必然发生core dump,为什..........


Repat it!  It depends on system,  every system might has its unique algorithm
in some corner of memory management.
one thousand different system might have one thousand different implement
of  memory management!

that's all I can say for this topic!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP