如果句柄为 NULL,pcap_close() 会崩溃

pcap_close() crashes if handle is NULL

预计 pcap_close(NULL) 会出现段错误吗?我在 libpcap-1.7.4-2ubuntu0.1 上观察到这种行为。 man 页面没有说明 NULL pcap_t * 函数的行为。我用谷歌搜索也找不到任何东西。

没有文档?只需检查 source code:

void pcap_close(pcap_t *p)
{    
    if (p->opt.device != NULL)

        free(p->opt.device);

    p->cleanup_op(p);

    free(p);
}

第一条指令读取 p->opt.device 如果 pNULL,则它具有未定义的行为。

防范 NULL 将是一个简单的增强。另一方面,崩溃是确定性的,并且在传递空指针时可以轻松调试。

来自 the manual page:

#include <pcap/pcap.h>
void pcap_close(pcap_t *p);

pcap_close() closes the files associated with p and deallocates resources.

很明显该函数要与 有效 指针一起使用。 NULL 指针没有需要释放的 "files associated" 或 "resources"。该函数使用变量 p 并假定它是指向有效 pcap_t 类型的指针。传入 NULL 使其取消引用 NULL ,当然这会导致分段错误。

再看the source code这个就更明显了:

void
pcap_close(pcap_t *p)
{
    if (p->opt.device != NULL)
        free(p->opt.device);
    p->cleanup_op(p);
    free(p);
}

这种行为很常见,您会在几乎每个用于 close/free/clean 先前请求的资源的 C 库函数中找到它。在 C 中,NULL 检查 几乎总是 留给调用者,否则你很可能会发现它明确写在文档中。

其他答案正确。通常(不特定于 pcap_close),除非某些东西被 记录 接受空指针并特殊对待它,默认假设应该始终是传递空指针是违反接口联系,因为空指针不是有效指针指向函数被记录为期望接收指向的任何指针。