fuite de mémoire de getaddrinfo

j'ai ce code pour obtenir des informations sur L'adresse 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);
}

mais si j'ai testé argv[hostPara] "www.google.com" je suis cela de 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)

et si argv[hostPara]"www.ubuntu.com" il n'y a pas de fuites de mémoire. Quel Est ce comportement magique?

16
demandé sur Coding Mash 2012-11-05 14:11:16

3 réponses

Cherche un peu gblic, il s'agit de la capture d'objets en cas d'ipv6 (regardez la ligne 249).

comme d'autres membres l'ont expliqué, "still reachable" n'est pas une erreur en soi, mais il peut cacher certaines situations buggy. Dans ce cas, il n'est pas un problème, juste un avertissement à propos de quelque chose qui pourrait cacher quelque chose de méchant.

cet avertissement a également été signalé à redhat

La raison de l'avertissement de google, et pas pour ubuntu c'est beacause google a ipv6 déployé sur ses serveurs et ubuntu pas, et puis la capture n'est pas effectuée. Vous pouvez le vérifier avec:

nslookup -q=AAAA www.google.com  and nslookup -q=AAAA www.ubuntu.com
11
répondu Jon Ander Ortiz Durántez 2012-11-05 10:41:09

ce n'est peut-être pas une fuite de mémoire (techniquement c'est le cas, mais vous ne devriez pas vous en inquiéter) parfois les bibliothèques attribuent de la mémoire la première fois qu'une fonction est appelée pour des appels ultérieurs. vous pouvez avoir valgrind supprimer ces erreurs si vous le souhaitez.

FAQ:

"accessible" signifie que votre programme est probablement ok, il n'est pas gratuit certains de mémoire qu'elle pourrait avoir. C'est assez courant et souvent raisonnable. Ne pas utiliser de --montrer-accessible=oui si vous ne voulez pas voir ces rapports.

5
répondu iabdalkader 2012-11-05 10:44:01

ça dit "toujours joignable". Cela signifie probablement que la bibliothèque a alloué de la mémoire pour une cache ou quelque chose comme ça et ne veut pas la libérer. Vous pouvez l'ignorer ou, au moins, il a besoin de plus d'analyse que de dire que c'est une fuite de mémoire.

pourquoi il y a une différence entre les différents hôtes est anyone devinez. Probablement parce que des serveurs de noms différents nécessitent un type de travail différent.

2
répondu Art 2012-11-05 10:25:28