免费注册 查看新帖 |

Chinaunix

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

[C] 莫明其妙的C特殊问题, 竟然是这样被我解决的 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-01 00:35 |只看该作者 |倒序浏览
之前我自己作的 scws-1.0.x 分词系统在各平台均有长期稳定运行并且没有出错, 跟踪了很久也没有发现有内存方面的问题.

但非常奇怪的是, 在 Ubuntu-7.10 内核 2.6.22-14-server,  gcc version 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)
这个环境下, 竟然出现段地址错误, 导到非法.

但由于这个调用是在一个 .so 共享库里, 不知怎么样才能进入它的代码段(list出不来), 如果我把共享库静态连接在一起, 那么程序又是正确运行没有段地址错误,
真是令人抓狂.  开启 -g 选项后能在主程序的 backtrace 中看到几个调用栈, 但实在看不出来哪儿错了.

代码段循环体是用 for() 的, 后来我改成 do {} while(); 竟然就好了, 也可以链接到其它文件中去了..... 迷茫!!

[能正确运行的代码]
  1. xtree_t xdb_to_xtree(xdb_t x, xtree_t xt)
  2. {
  3.     int i = 0;
  4.         xptr_st ptr;

  5.         if (!x)
  6.                 return NULL;

  7.         if (!xt && !(xt = xtree_new(x->base, x->prime)))
  8.                 return NULL;

  9.     do
  10.         {
  11.                 _xdb_read_data(x, &ptr, i * sizeof(xptr_st) + sizeof(struct xdb_header), sizeof(xptr_st));
  12.                 _xdb_to_xtree_node(x, xt, &ptr);
  13.         }
  14.     while (++i < x->prime);

  15.         return xt;
  16. }
复制代码


2. 运转出错(段地址错误)的代码

  1. xtree_t xdb_to_xtree(xdb_t x, xtree_t xt)
  2. {
  3.     int i;
  4. xptr_st ptr;
  5. if (!x)
  6.   return NULL;
  7. if (!xt && !(xt = xtree_new(x->base, x->prime)))
  8.   return NULL;
  9.   for(i=0; i< x->prime; i++)  
  10. {
  11.   _xdb_read_data(x, &ptr, i * sizeof(xptr_st) + sizeof(struct xdb_header), sizeof(xptr_st));
  12.   _xdb_to_xtree_node(x, xt, &ptr);
  13. }
  14. return xt;
  15. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2009-01-01 00:45 |只看该作者
我感觉不单是改个语法那么简单。访问越界?

论坛徽章:
0
3 [报告]
发表于 2009-01-01 01:45 |只看该作者
原帖由 langue 于 2009-1-1 00:45 发表
我感觉不单是改个语法那么简单。访问越界?


我在想要么就是这个版本的gcc 的问题, 优化时搞出的.. 关键是静态连接方便调试它却没问题

论坛徽章:
0
4 [报告]
发表于 2009-01-01 02:08 |只看该作者
都有可能

论坛徽章:
0
5 [报告]
发表于 2009-01-01 09:34 |只看该作者
if (!xt && !(xt = xtree_new(x->base, x->prime)))
                return NULL;

.....

论坛徽章:
0
6 [报告]
发表于 2009-01-01 11:11 |只看该作者
原帖由 虎皮尖椒 于 2009-1-1 09:34 发表
if (!xt && !(xt = xtree_new(x->base, x->prime)))
                return NULL;
.....


这句有问题么?
检查传进来的 xt 参数是否为 NULL , 如果为 NULL 调用 xtree_new 新建一个, 如果新建失败那就返回 NULL

不过 !(xt = ...) 最好写成 (xt = ...) == NULL
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP