是否期望pcap_close(NULL)
段错误?我在libpcap-1.7.4-2ubuntu0.1
上观察到此行为。 man
页面没有说明NULL
pcap_t *
的功能行为。我用Google搜索,也找不到任何东西。
其他答案是正确的。通常,(不是专门针对pcap_close
的),除非documented接受某种空指针并对其进行特殊处理,否则默认假设应始终是传递空指针违反接口接触,因为空指针是不是有效指针指向记录有函数希望接收到的指针的任何对象。
#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
检查留给了调用者几乎总是,如果没有,您很有可能会在文档中明确写出它。
没有文档?只需检查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
会很容易。另一方面,崩溃是确定性的,并且在传递空指针时可以轻松调试。