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


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

    *** 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()。

  • 相关阅读:
    阻塞IO与非阻塞IO
    Java 中 IO 流分为几种?BIO,NIO,AIO 有什么区别?
    linux7启动时自动启动zookeeper和Tomcat
    linux7下配置Tomcat
    背景图片变色,或者背景渐变
    Linux7版本网络配置
    linux7中jdk安装
    linux7中zookeeper的安装-依赖于jdk
    Avoided redundant navigation to current location
    Auto Fix is enabled by default. Use the single string form
  • 原文地址:https://www.cnblogs.com/balaamwe/p/2321075.html
Copyright © 2020-2023  润新知