2012-11-05 35 views
16

Mam ten kod do uzyskiwania informacji o adresie IPv4:getaddrinfo pamięci wyciek

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); 
} 

ale jeśli testowane argv [hostPara] jest "www.google.com" jestem coraz to z 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) 

i jeśli argv[hostPara] jest "www.ubuntu.com", nie ma wycieków pamięci. Co to za magiczne zachowanie?

+2

Może być, ponieważ google.com przełączył się na ipv6, a na ubuntu.com go nie ma? To znaczy. z google dostajesz bufor przekroczony w addr4 –

+1

Czy to się sumuje, jeśli powtórzysz wywołanie 'getaddrinfo()'/'freeaddrinfo()'? – alk

+0

A jest sposób, aby sprawdzić, jakie wersje zastosowań serwera IP dns? (bez wycieków pamięci) –

Odpowiedz

5

To nie może być przeciek pamięci (technicznie rzecz biorąc, ale nie powinieneś się o to martwić) czasami biblioteki przydzielają pamięć za pierwszym razem, gdy wywoływana jest funkcja dla kolejnych wywołań. Jeśli chcesz, możesz mieć te błędy.

Z FAQ:

„nadal osiągalny” oznacza program jest chyba ok - nie za darmo część pamięci może to mieć. Jest to dość powszechne i często uzasadnione. Nie używaj opcji --show-reachable = yes, jeśli nie chcesz wyświetlać tych raportów.

+0

Hm Mam ten kod w projekcie szkolnym i może on zostać oceniony negatywnie. Ponieważ liczba allocentów i zwolnień jest różna. == == HEAP STRESZCZENIE 20489: 20489 == == używane na wyjściu: 168 bajtów 1 bloków == == 20489 Całkowite zużycie sterty: 170 ALLOCS 169 zwalnia, 38,042 bajtów przydzielone –

+0

@ PetrPřikryl i don Nie widzisz żadnego problemu w sposobie, w jaki wywołujesz getaddrinfo, więc prawdopodobnie jest to lokalna pamięć przydzielona dla getaddrinfo. to jest naprawdę powszechne w bibliotekach, aby to zrobić. – iabdalkader

+0

@ PetrPřikryl sprawdź aktualizację – iabdalkader

2

Mówi "wciąż osiągalne". To prawdopodobnie oznacza, że ​​biblioteka przydzieliła trochę pamięci na pamięć podręczną lub coś w tym stylu i nie chce jej zwolnić. Możesz spokojnie zignorować to lub przynajmniej potrzebuje więcej analizy niż po prostu mówiąc, że to przeciek pamięci.

Istnieje różnica między różnymi hostami. Prawdopodobnie dlatego, że różne serwery nazw wymagają innego rodzaju pracy.

11

Patrząc trochę na gblic, chodzi o zatrzymanie obiektu w przypadku ipv6 (patrz linia 249).

Jak wyjaśnili inni członkowie, "wciąż osiągalne" nie jest błędem samym w sobie, ale może ukryć pewne błędy. W tym przypadku nie stanowi to problemu, tylko ostrzeżenie o czymś, co może ukryć coś nieprzyjemnego.

To ostrzeżenie Donoszono również do redhat

przyczynę ostrzeżenia dla Google, a nie dla Ubuntu to beacause Google IPv6 rozmieszczone na swoich serwerach i ubuntu nie, i wtedy wzrok nie jest wykonywana. Możesz to sprawdzić za pomocą:

nslookup -q=AAAA www.google.com and nslookup -q=AAAA www.ubuntu.com 
+1

+1 za zgłoszenie błędu – iabdalkader