zoukankan      html  css  js  c++  java
  • valgrind 程序测试出错 Invalid read of size 4

    今天测试发现valgrind发现了一个错误 :Invalid read of size 4

    但是之前还测试得好好的, 于是一步步排查错误, 错误的具体信息如下:

    Invalid read of size 4

    ==19400==    at 0x4009460: memcpy (mc_replace_strmem.c:883)

    ==19400==    by 0x804CA18: dequeue_queue (queue_linklist.c:83)

    ==19400==    by 0x804C3FE: pthread_sender (pthread_sender.c:253)

    ==19400==    by 0x364A48: start_thread (in /lib/libpthread-2.12.so)

    ==19400==    by 0x2A0AAD: clone (in /lib/libc-2.12.so)

    ==19400==  Address 0x78ad17c is 4 bytes after a block of size 80 alloc'd

    ==19400==    at 0x40072D5: malloc (vg_replace_malloc.c:291)

    ==19400==    by 0x804C94B: insert_data_queue (queue_linklist.c:24)

    ==19400==    by 0x804BC75: pthread_recv_data (pthread_recv_data.c:1103)

    ==19400==    by 0x364A48: start_thread (in /lib/libpthread-2.12.so)

    ==19400==    by 0x2A0AAD: clone (in /lib/libc-2.12.so)

    错误出现的地方是链表的插入环节, 于是我找到了链表的插入函数, 以下就是测试代码:

    但根据这代码找不出问题所在

    测试了好就仍然没有发现问题, 最后发现了一个疑问:节点的容量太小而插入的数据较大, 导致擦写到了不该访问的内存

    于是将节点的数据存储大小调大一倍(原本是64字节, 改成128字节), 再次测试, 问题终于解决

    反思:

      本次的错误出现的原因是

        1. 对数据的大小猜测不够准确, 没有预留足够大的空间

        2. 程序本身没有做数据大小判断, 针对于类似memcpy等本身没有检错能力的=函数,我们必须人为地加以判断

  • 相关阅读:
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    MFC/.NET
    学习小结——记于华为2018届校园招聘宣讲会之后
    槽点今天未想到
  • 原文地址:https://www.cnblogs.com/sirius-xu/p/3547663.html
Copyright © 2011-2022 走看看