[转]double free or corruption (!prev): 0x080644c8 ***

news/2024/6/18 21:31:30

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

*** 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, "%10s",p); //now safef("hello world!"); //string is chopped to "hello worl" 
相似的,使用strncpy()、strncmp()、strncat()、strnicmp() 和 strnset() 相应地代替strcmp()、strcat()、stricmp() 和 strset()。


http://www.niftyadmin.cn/n/1580133.html

相关文章

[收藏]iframe的WPO优化技巧

为什么80%的码农都做不了架构师?>>> http://www.webusability.cn/howto-wpo-for-iframe-460/ 转载于:https://my.oschina.net/leeoo/blog/39101

写在新年伊始

快过年了,今天一个人在家折腾了一天,打扫屋子,现在刚刚坐下来。遂燃起一支烟,泡上一杯北京人都喜欢的花茶,放上一张CD,享受一下。 很久没有写过东西了,博客也很久没有写了。在这新旧交替的时刻&…

ZOOKEEPER启动遇到显示IT IS PROBABLY NOT RUNNING的众多问题解决

加粗样式 ZOOKEEPER启动遇到显示IT IS PROBABLY NOT RUNNING的问题解决 本人是启动三台虚拟机分别是hadoop01,hadoop02,hadoop03,我在主节点启动zookeeper的zkServer.sh start服务后,在通过status查看其状态,发现第三台hadoop03节…

匹配一个字符

/[Ll]ove/ []表示匹配括号字符集中的一个字符即可。在本例子中,vi将寻找包含Love或者love的行。转载于:https://blog.51cto.com/huyanshu/767732

Flume架构及核心组件

Flume架构及核心组件 1)Source 收集 2)Channel 聚集 3)Sink 输出 channel相当于一个通道,类似于一个数据的缓存池,提供一个数据临时存放的地方。在操作系统层面,写数据到磁盘,先会把数据写到内存…

sencha touch 2与phonegap结合开发web app

1、下载sencha-touch-2-pr3和phonegap-1.3.0; 2、在assets(Java EE IDE)下面创建www, 然后在www下面创建js文件夹,如下所示: 3、把sencha-touch-all.js和phonegap-1.3.0.js复制到js文件夹下面; 4、在工程目录下创建lib…

linux解析

VMware一些常见名词解析: 虚拟网卡(网络适配器):MAC地址 虚拟交换机:把一些电脑连接在一起组成一个局域网 虚拟网桥:扩展网络和通信的手段 NAT:网络地址转换,对外部网络隐蔽内部网络 网卡&#…

2011年网上败家记录

2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/allanyan/blog/39771