代码之家  ›  专栏  ›  技术社区  ›  Greg Schmit

为什么valgrind在调用“pcap\u open\u offline”时报告内存泄漏?

  •  0
  • Greg Schmit  · 技术社区  · 6 年前

    我正在试图弄清楚我是否有一个愚蠢的时刻,或者libpcap中是否真的存在内存泄漏。我正在运行Ubuntu 17.10和libpcap 1.8.1-5ubuntu1。如此成熟的图书馆似乎不太可能出现漏洞。

    为了制作MVCE,我删掉了所有内容,因此,这段代码除了演示泄漏之外,实际上什么都做不了:

    #include <stdio.h>
    #include <stdlib.h>
    #include <pcap.h>
    
    int main(int argc, char **argv)
    {
            char errbuf[PCAP_ERRBUF_SIZE];
    
            pcap_t *fd = pcap_open_offline(argv[1], errbuf);
    
            if (!fd) {
                    printf("error: %s\n", errbuf);
            }
    
            free(fd); fd = 0;
    
            return 0;
    }
    

    valgrind报告(重点补充):

    ==6871==
    ==6871== HEAP SUMMARY:
    ==6871==     in use at exit: 262,696 bytes in 2 blocks
    ==6871==   total heap usage: 4 allocs, 2 frees, 267,432 bytes allocated
    ==6871==
    ==6871== Searching for pointers to 2 not-freed blocks
    ==6871== Checked 73,072 bytes
    ==6871==
    ==6871== 262,144 bytes in 1 blocks are definitely lost in loss record 2 of 2
    ==6871==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==6871==    by 0x4E5B89F: ??? (in /usr/lib/x86_64-linux-gnu/libpcap.so.1.8.1)
    ==6871==    by 0x4E5AE5C: pcap_fopen_offline_with_tstamp_precision (in /usr/lib/x86_64-linux-gnu/libpcap.so.1.8.1)
    ==6871==    by 0x4E5B05D: pcap_open_offline_with_tstamp_precision (in /usr/lib/x86_64-linux-gnu/libpcap.so.1.8.1)
    ==6871==    by 0x1087A0: main (test.c:9)
    ==6871==
    ==6871== LEAK SUMMARY:
    ==6871==    definitely lost: 262,144 bytes in 1 blocks
    ==6871==    indirectly lost: 0 bytes in 0 blocks
    ==6871==      possibly lost: 0 bytes in 0 blocks
    ==6871==    still reachable: 552 bytes in 1 blocks
    ==6871==         suppressed: 0 bytes in 0 blocks
    ==6871== Reachable blocks (those to which a pointer was found) are not shown.
    ==6871== To see them, rerun with: --leak-check=full --show-leak-kinds=all
    ==6871==
    ==6871== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
    ==6871== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
    1 回复  |  直到 6 年前
        1
  •  4
  •   rici    6 年前

    libpcap manpage , 略加编辑:

    pcap_fopen_offline() 返回一个指向 pcap_t ,这是用于读取数据包的句柄…要关闭句柄,请使用 pcap_close()

    free(fd) 只释放一块内存,因为 free() pcap\t公司 . 为了正确处置分配的资源,您需要使用 pcap_close(fd) 相反,正如文档所示。