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

问题描述 投票:1回答:3

是否期望pcap_close(NULL)段错误?我在libpcap-1.7.4-2ubuntu0.1上观察到此行为。 man页面没有说明NULL pcap_t *的功能行为。我用Google搜索,也找不到任何东西。

c pcap libpcap
3个回答
3
投票

其他答案是正确的。通常,(不是专门针对pcap_close的),除非documented接受某种空指针并对其进行特殊处理,否则默认假设应始终是传递空指针违反接口接触,因为空指针是不是有效指针指向记录有函数希望接收到的指针的任何对象。


3
投票

来自the manual page

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

[pcap_close()关闭与p关联的文件并释放资源。

很明显,该函数应与valid指针一起使用。 NULL指针没有需要释放的“关联文件”或“资源”。该函数使用变量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);
}

此行为非常普遍,您几乎可以在用于关闭/释放/清理先前请求的资源的每个C库函数中找到它。在C语言中,NULL检查留给了调用者几乎总是,如果没有,您很有可能会在文档中明确写出它。


2
投票

没有文档?只需检查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.devicep,则第一条指令读取具有未定义行为的NULL

保护NULL会很容易。另一方面,崩溃是确定性的,并且在传递空指针时可以轻松调试。

© www.soinside.com 2019 - 2024. All rights reserved.