debug c++ 经验积累(1)-double free or corruption (!prev)


最近在开发分布式系统的时候,出现了double free的问题,查了发现自己并没有double free,后来在网上查了一些资料,才发现原来是如下原因。

写了一个多线程的代码,在主线程中申请了一块内存,在另一个线程中释放内存,老出错误,不知道是怎么回事。

*** glibc detected *** /home/ydx/vehicle-program/vehicle-v1.0/t: double free or corruption (!prev): 0x080644c8 ***
======= Backtrace: =========
/lib/libc.so.6[0x7c7261]
/home/ydx/vehicle-program/vehicle-v1.0/t[0x804991e]
/home/ydx/vehicle-program/vehicle-v1.0/t[0x8048fb0]
/lib/libpthread.so.0[0x8dcab5]
/lib/libc.so.6(clone+0x5e)[0x83383e]

00759000-008c7000 r-xp 00000000 fd:00 158969     /lib/libc-2.11.so
008c7000-008c8000 ---p 0016e000 fd:00 158969     /lib/libc-2.11.so
008c8000-008ca000 r--p 0016e000 fd:00 158969     /lib/libc-2.11.so
008ca000-008cb000 rw-p 00170000 fd:00 158969     /lib/libc-2.11.so

查找了好长时间的原因,都没找到,最后找到的原因原因如下

1.并没有double free,这一点是肯定的

原因:

n=get_node(STATINFO_SIZE);//申请了一个160字节的区域

调用sprintf函数向这个区域写的字节数是远大于160字节的

释放的时候就会出现这种问题

可能sprintf打印的字节数超过160字节时,没有报错,释放的时候要全部释放,超过160字节,就报出了段错误

为了解决这种无意识的错误,以后要用这个函数

黑客通常利用这类脆弱的代码来入侵看上去安全的系统。要修正这一缺陷,可以使用函数snprintf()代替函数sprintf(),函数snprintf() 的原型为:
intsnprintf(char* buf, size_t maxlen, const char* fmt, ...); 
第二个参数定义能被写到 buf 中的字符的最大个数,不考虑格式标志以及源字符串的大小:    
snprintf(buf, 10, "s",p); //now safef("hello world!"); //string is chopped to "hello worl" 
相似的,使用strncpy()strncmp()strncat()strnicmp()  strnset() 相应地代替strcmp()strcat()stricmp()  strset()。例如:


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值