如果句柄为 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
如果 p
是 NULL
,则它具有未定义的行为。
防范 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
),除非某些东西被 记录 接受空指针并特殊对待它,默认假设应该始终是传递空指针是违反接口联系,因为空指针不是有效指针指向函数被记录为期望接收指向的任何指针。
预计 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
如果 p
是 NULL
,则它具有未定义的行为。
防范 NULL
将是一个简单的增强。另一方面,崩溃是确定性的,并且在传递空指针时可以轻松调试。
来自 the manual page:
#include <pcap/pcap.h> void pcap_close(pcap_t *p);
pcap_close()
closes the files associated withp
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
),除非某些东西被 记录 接受空指针并特殊对待它,默认假设应该始终是传递空指针是违反接口联系,因为空指针不是有效指针指向函数被记录为期望接收指向的任何指针。