免费注册 查看新帖 |

Chinaunix

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

[C] malloc函数出现realfree SEGV错误 [复制链接]

论坛徽章:
3
亥猪
日期:2013-08-28 12:50:23白羊座
日期:2013-11-25 12:55:50酉鸡
日期:2014-02-12 10:46:13
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-06 12:56 |只看该作者 |倒序浏览
项目中,我的程序在malloc(32)的时候出现段错误,DBX环境下打印malloc(32)返回值为1378512(乱值),打印 *1378512,提示这不是一个地址。
这类问题在站内找到了一个与我很是相似的贴,但是这个贴已经非常早了,http://bbs.chinaunix.net/thread-6188-1-1.html,看来这类问题前辈们早就领教过了,但却没能有一个明了的解释或者解决办法  {:3_201:}
望知晓一二的前辈们提示提示!如果能够提供一些可行的DEBUG方法也行!环境为SOLARIS 10,CC编译,m64。谢谢了!{:3_193:}

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
2 [报告]
发表于 2013-03-06 14:17 |只看该作者
回复 1# joepayne


    无代码,无真相。拿分,走人

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
3 [报告]
发表于 2013-03-06 15:15 |只看该作者
贴代码吧,,,,,只要不是NULL , 是不能通过返回值来判断是否错误的

论坛徽章:
0
4 [报告]
发表于 2013-03-06 15:24 |只看该作者
没有测试程序也不能调试调试,拿分走人。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
5 [报告]
发表于 2013-03-06 16:29 |只看该作者
楼主就快要解决了, bug都是自己干的, 怀疑系统和硬件只是一个过程..

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
6 [报告]
发表于 2013-03-06 17:00 |只看该作者
linux_c_py_php 发表于 2013-03-06 16:29
楼主就快要解决了, bug都是自己干的, 怀疑系统和硬件只是一个过程..


论坛徽章:
3
亥猪
日期:2013-08-28 12:50:23白羊座
日期:2013-11-25 12:55:50酉鸡
日期:2014-02-12 10:46:13
7 [报告]
发表于 2013-03-10 14:42 |只看该作者
楼主就快要解决了, bug都是自己干的, 怀疑系统和硬件只是一个过程..

这位朋友讲得真是精辟啊!!!虽说自己经验浅薄,但也明白了一个道理“认识是需要一个过程的”{:3_193:}
我的程序现在好像暂时安全了,可以交差了,我的结论是由于我的一个数组下标是用一个宏来标识的,这个宏的值小了,导致数组溢出了......
但是我又还是非常怀疑我的结论,所以下面我把具体的代码场景给大家展示一下,望前辈们给我定夺定夺!!!{:3_193:}
#define MAX_NAME 15
...
struct TB{
char tb_name[MAX_NAME];
unsigned short tb_id;
int length;
char tb_ins[MAX_NAME];
};
...
struct TB* p_tb = calloc(N,sizeof(struct TB));
for(i = 0;i < N;i++ ){   /*这个N的值并不大,最多就十几*/
...
strncpy(p_tb.tb_name,name,sizeof(name));
p_tb.tb_id = id;
p_tb.length = len;
strncpy(p_tb.tb_inst,inst,sizeof(inst));
...
func(..,..,..);
...
}
...
func(){
...
p_locoal = calloc(M,1); /*这个M的值也并不大,100以内*/   
...
}
“偶尔”会在FUNC函数(进行到for 循环的最后一次时)的calloc函数处CORE DUMPED 出现realfree segv错误,当然并不一定完全就是CALLOC函数才CORE DUMPED,如果换作其它的接口,只要底层调的是maloc接口(分配堆空间)都会出现以上错误。注意这里,说的“偶尔”指的是我的程序的参数换一下,或许就不会出错。当我把这个宏调到足够大时,程序“暂时”稳定了下来。
经过调查发现,在调用FUNC函数之间的填充操作中,strncpy函数的第三个参数的值很可能会超出宏定义的MAX_NAME的大小,导致堆中的结构体数组成员溢出,这里我对于这个时候因数组溢出而导致的后果的推断是会覆盖结构体后序的成员,好像并不会导致CORE DUMPED,顶多填充的数据全乱了,这是我的疑问1??
针对这个问题我又做了相关的测试,下面更让人感到郁闷了!{:3_198:}
当我又增加了一组数据,也就是说STRUCT TB多分配了一个,循环也多了一层,这样程序竟然正常地跑了起来!!!{:3_183:}我DBX 跟踪了一下,留意看了下我填充的STRUCT TB结构,发现即使strncpy第三个参数要比MAX_NAME大,填充后,结构体的tb_id 并不没有被覆盖,tb_name被截断了!{:3_183:}

论坛徽章:
3
亥猪
日期:2013-08-28 12:50:23白羊座
日期:2013-11-25 12:55:50酉鸡
日期:2014-02-12 10:46:13
8 [报告]
发表于 2013-03-10 14:45 |只看该作者
贴代码吧,,,,,只要不是NULL , 是不能通过返回值来判断是否错误的

仁兄讲得很在理!!!{:3_193:}

论坛徽章:
3
亥猪
日期:2013-08-28 12:50:23白羊座
日期:2013-11-25 12:55:50酉鸡
日期:2014-02-12 10:46:13
9 [报告]
发表于 2013-03-15 11:30 |只看该作者
11111111111111
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP