【发布时间】:2020-01-21 20:03:23
【问题描述】:
预计pcap_close(NULL) 会出现段错误吗?我在libpcap-1.7.4-2ubuntu0.1 上观察到这种行为。 man 页面没有说明 NULL pcap_t * 的函数行为。我用谷歌搜索也找不到任何东西。
【问题讨论】:
-
您找到了答案:保护呼叫免受 NULL 影响
预计pcap_close(NULL) 会出现段错误吗?我在libpcap-1.7.4-2ubuntu0.1 上观察到这种行为。 man 页面没有说明 NULL pcap_t * 的函数行为。我用谷歌搜索也找不到任何东西。
【问题讨论】:
#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 检查几乎总是留给调用者,如果不是,您很可能会在文档中明确地找到它。
【讨论】:
其他答案都是正确的。通常(不特定于pcap_close),除非有文档接受空指针并对其进行特殊处理,否则默认假设应该始终是传递空指针违反接口联系,因为空指针不是一个有效的指针,指向任何记录的函数期望接收到的指针。
【讨论】:
没有文档?只需检查source code:
void pcap_close(pcap_t *p)
{
if (p->opt.device != NULL)
free(p->opt.device);
p->cleanup_op(p);
free(p);
}
如果p 是NULL,则第一条指令读取p->opt.device 具有未定义的行为。
防止NULL 将是一个简单的增强。另一方面,崩溃是确定性的,并且可以在传递空指针时轻松调试。
【讨论】:
fclose 在通过 NULL 时失败,但 free 保证可以工作……去看看。