• 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等本身没有检错能力的=函数,我们必须人为地加以判断

  • 相关阅读:
    Python 元类
    Rsync 基础配置
    linux shell find
    找最大的目录
    云主机的上下行带宽
    关于c3p0 ResourcePoolException: Attempted to use a closed or broken resource pool
    recover_file
    MegaCli 监控raid状态
    influxdb
    在Ubuntu 16.04如何安装Java使用apt-get的
  • 原文地址:https://www.cnblogs.com/sirius-xu/p/3547663.html
Copyright © 2020-2023  润新知