утечка памяти в getaddrinfo

У меня есть этот код для получения информации об адресе IPv4:

struct addrinfo hints, *info = NULL;
char addr4[INET_ADDRSTRLEN];

memset(&hints, 0, sizeof(hints));
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AF_INET;

if (!getaddrinfo(argv[hostPara], NULL, &hints, &info)) {
inet_ntop(AF_INET, &((const sockaddr_in *)info->ai_addr)->sin_addr, addr4, INET_ADDRSTRLEN);
}
if (info != NULL) {
freeaddrinfo(info);
}

но если я проверил argv [hostPara] это «www.google.com», я получаю это от valgrind:

==3632== 168 bytes in 1 blocks are still reachable in loss record 1 of 1
==3632==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3632==    by 0x524B5B8: make_request (check_pf.c:249)
==3632==    by 0x524BA53: __check_pf (check_pf.c:342)
==3632==    by 0x5201134: getaddrinfo (getaddrinfo.c:2458)
==3632==    by 0x40186B: main (trace.cc:214)

и если argv[hostPara] является "www.ubuntu.com" нет утечек памяти. Что это за волшебное поведение?

16

Решение

Глядя немного gblic, речь идет об отлове объектов в случае ipv6 (смотрите строку 249).

Как объяснили другие участники, «все еще достижимо» не само по себе ошибка, но она может скрывать некоторые ошибочные ситуации. В этом случае это не проблема, просто предупреждение о том, что может скрыть что-то неприятное.

Это предупреждение также было сообщено Красная шляпа

Причина предупреждения для Google, а не для Ubuntu, потому что Google развернул ipv6 на своих серверах, а Ubuntu — нет, и тогда отлов не выполняется. Вы можете проверить это с:

nslookup -q=AAAA www.google.com  and nslookup -q=AAAA www.ubuntu.com
11

Другие решения

Это может не быть утечка памяти (технически это так, но не стоит об этом беспокоиться), иногда библиотеки выделяют память при первом вызове функции для последующих вызовов. ты можешь иметь валгринда подавлять эти ошибки, если хотите.

От Часто задаваемые вопросы:

«все еще достижимо» означает, что ваша программа, вероятно, в порядке — она ​​не была бесплатной
немного памяти это могло бы иметь. Это довольно часто и часто разумно.
Не используйте —show-reachable = yes, если вы не хотите видеть эти отчеты.

5

Там написано «все еще достижимо». Это, вероятно, означает, что библиотека выделила часть памяти для кеша или чего-то в этом роде и не хочет ее освобождать. Вы можете спокойно проигнорировать это или, по крайней мере, он требует большего анализа, чем просто сказать, что это утечка памяти.

Почему есть разница между разными хостами, можно догадаться. Возможно, потому что разные серверы имен требуют разного типа работы.

2
По вопросам рекламы [email protected]