是否期望pcap_close(NULL)
存在段错误?我在libpcap-1.7.4-2ubuntu0.1
上观察到此行为。 man
页未提及NULL
pcap_t *
的功能行为。我用谷歌搜索,也找不到任何东西。
答案 0 :(得分:3)
#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
检查几乎总是留给调用者,如果没有,您很可能会发现它明确写在文档中。
答案 1 :(得分:3)
其他答案是正确的。通常,(并非专门针对pcap_close
),除非有文件证明接受某个空指针并对其进行特殊处理,否则默认假设应始终是传递空指针违反了接口联系人,因为空指针不是有效的指针,指向要记录的函数希望接收到的任何指针。
答案 2 :(得分: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.device
如果p
为NULL
,则行为未定义。
对NULL
进行保护将是一个容易的增强。另一方面,崩溃是确定性的,并且在传递空指针时很容易调试。