2012-11-05 20 views
16

Ho questo codice per ottenere informazioni su IPv4 indirizzo:getaddrinfo Perdita di memoria

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

ma se ho provato argv [hostPara] è "www.google.com" Mi è toccato questo da 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) 

e se argv[hostPara] è "www.ubuntu.com" non ci sono perdite di memoria. Cos'è questo comportamento magico?

+2

Forse perché google.com è passato a ipv6 e ubuntu.com no? Cioè con google ottieni buffer overrrun in addr4 –

+1

Questo riassume se si ripete chiamando 'getaddrinfo()'/'freeaddrinfo()'? – alk

+0

E c'è un modo per verificare quali versioni del server DNS IP utilizza? (senza perdite di memoria) –

risposta

5

Questa potrebbe non essere una perdita di memoria (tecnicamente lo è, ma non dovresti preoccupartene) a volte le librerie allocano la memoria la prima volta che viene chiamata una funzione per le chiamate successive. puoi avere valgrind suppress quegli errori se vuoi.

Dal FAQ:

"ancora raggiungibile" significa che il programma è probabilmente ok - non fu così libero po 'di memoria che potrebbe avere. Questo è abbastanza comune e spesso ragionevole. Non utilizzare --show-reachable = yes se non si desidera visualizzare questi report.

+0

Hm Ho questo codice nel progetto scolastico e potrebbe essere valutato negativo. Perché i numeri di alloc e frees sono diversi. == == 20489 MUCCHIO SINTESI: == == 20489 vengono usate in uscita: 168 byte 1 blocchi == == 20489 utilizzo totale mucchio: 170 allocazioni, 169 libera, 38,042 byte allocato –

+0

@ PetrPřikryl I don Non vedo alcun problema nel modo in cui chiami getaddrinfo, quindi è probabilmente la memoria locale allocata per getaddrinfo. è molto comune con le librerie fare quello – iabdalkader

+0

@ PetrPřikryl controllare l'aggiornamento – iabdalkader

2

Dice "ancora raggiungibile". Questo probabilmente significa che la libreria ha allocato un po 'di memoria per una cache o qualcosa del genere e non vuole liberarlo. Puoi tranquillamente ignorarlo o almeno ha bisogno di più analisi del solo dire che è una perdita di memoria.

Perché c'è una differenza tra diversi host è qualcuno congettura. Probabilmente perché server di nomi diversi richiedono un tipo di lavoro diverso.

11

Guardando un po 'il gblic, si tratta di catturare oggetti in caso di ipv6 (vedi 249 linee).

Come altri membri hanno spiegato, "ancora raggiungibile" non è un errore in sé, ma può nascondere alcune situazioni bug. In questo caso non è un problema, solo un avvertimento su qualcosa che potrebbe nascondere qualcosa di brutto.

Questo avviso è stato anche segnalato per redhat

Il motivo della segnalazione per Google e non per Ubuntu che è beacause Google ha implementato IPv6 sui propri server e Ubuntu non, e poi la cattura non viene eseguita. Puoi verificarlo con:

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

+1 per il bug report – iabdalkader