为什么调用`pcap_open_offline`时,Valgrind会报告内存泄漏?

3

我正在尝试弄清楚自己是不是傻了还是libpcap确实存在内存泄漏问题。我正在运行Ubuntu 17.10和libpcap 1.8.1-5ubuntu1。这样一个成熟的库出现泄漏似乎不太可能。

为了制作最小复现代码,我已经删除了所有内容,因此,这段代码实际上并没有做太多事情,只是演示了泄漏:

#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
<b>==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)</b>
==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个回答

4

以下是编辑过的 libpcap manpage

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

free(fd) 只会释放单个内存块,因为 free() 对于 pcap_t 的内部结构一无所知。要正确处理已分配的资源,您需要使用文档所示的pcap_close(fd)


啊,谢谢!我正在查看pcap_open_offline()的手册页面(https://www.tcpdump.org/manpages/pcap_open_offline.3pcap.html),但它没有提到这一点。 - Greg Schmit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接