С страница руководства :
#include <pcap/pcap.h>
void pcap_close(pcap_t *p);
pcap_close()
закрывает файлы, связанные с p
и освобождает ресурсы.
Кажется очевидным, что функция предназначена для использования с valid указателем. Указатель NULL
не имеет «связанных файлов» или «ресурсов», которые должны быть освобождены. Функция использует переменную p
, предполагая, что это указатель на действительный тип pcap_t
. Передача NULL
делает разыменование NULL
и, конечно, это приводит к ошибке сегментации.
Глядя на исходный код , это еще более очевидно:
void
pcap_close(pcap_t *p)
{
if (p->opt.device != NULL)
free(p->opt.device);
p->cleanup_op(p);
free(p);
}
Такое поведение встречается довольно часто, и вы найдете его почти в каждой библиотеке C функция, используемая для закрытия / освобождения / очистки ранее запрошенного ресурса. В C проверка NULL
почти всегда оставлена вызывающей стороне, если нет, то вы, скорее всего, найдете ее явно написанной в документации.