2012-11-05 6 views
16

ich diesen Code haben, um Informationen über IPv4-Adresse bekommen:Getaddrinfo Speicherleck

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

aber wenn ich argv [hostPara] getestet wird "www.google.com" Ich erhalte diese von 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) 

und wenn argv[hostPara]"www.ubuntu.com" ist, gibt es keine Speicherlecks. Was ist dieses magische Verhalten?

+2

Kann sein, weil google.com hat auf IPv6 und Ubuntu.com nicht umgeschaltet? I.e. Mit Google bekommen Sie Puffer in addr4 überlaufen –

+1

Fasst dies zusammen, wenn Sie 'getaddrinfo()'/'freeaddrinfo()' '' wiederholen? – alk

+0

Und es gibt eine Möglichkeit, wie Sie überprüfen, welche Versionen von IP-DNS-Server verwendet? (ohne Speicherlecks) –

Antwort

5

Dies ist möglicherweise kein Speicherverlust (technisch ist es, aber Sie sollten sich keine Sorgen machen) manchmal Bibliotheken reservieren Speicher beim ersten Mal eine Funktion für nachfolgende Anrufe aufgerufen wird. Sie können Valgrind suppress diese Fehler haben, wenn Sie möchten.

Vom FAQ:

„noch erreichbar“ bedeutet, dass Ihr Programm ist wahrscheinlich ok - es ist nicht frei einige Speicher haben es geschafft haben könnte. Dies ist durchaus üblich und oft sinnvoll. Verwenden Sie nicht --show-reachable = yes, wenn Sie diese Berichte nicht sehen möchten.

+0

Hm Ich habe diesen Code im Schulprojekt und es könnte negativ bewertet werden. Weil die Anzahl der Allocs und Frees unterschiedlich ist. == == 20489 HEAP ZUSAMMENFASSUNG: == == 20489 im Einsatz bei der Ausfahrt: 168 Bytes in Blöcken 1 == == 20489 Gesamt Heap-Verbrauch: 170 Allocs, 169 frees, 38.042 Bytes –

+0

@ PetrPřikryl I don zugewiesen Wenn Sie getaddrinfo aufrufen, sehen Sie kein Problem. Es ist also wahrscheinlich lokaler Speicher für getaddrinfo reserviert. es ist wirklich üblich mit Bibliotheken, das zu tun – iabdalkader

+0

@ PetrPřikryl überprüfen Sie das Update – iabdalkader

2

Es sagt "immer noch erreichbar". Das bedeutet wahrscheinlich, dass die Bibliothek etwas Speicher für einen Cache oder etwas ähnliches zugewiesen hat und es nicht freigeben möchte. Sie können es ignorieren oder es braucht mehr Analyse als nur zu sagen, es ist ein Speicherleck.

Warum gibt es einen Unterschied zwischen verschiedenen Hosts ist Anyones rate. Wahrscheinlich, weil verschiedene Nameserver unterschiedliche Arten von Arbeit benötigen.

11

Blick ein wenig die gblic, es ist über Objekt Fang im Falle von ipv6 (siehe 249 Zeile).

Wie andere Mitglieder erklärt haben, ist "immer noch erreichbar" kein Fehler selbst, aber es kann einige Buggy-Situationen verbergen. In diesem Fall ist es kein Problem, nur eine Warnung vor etwas, das etwas Böses verbergen könnte.

Diese Warnung wurde auch auf redhat

Der Grund für die Warnung für Google und nicht für ubuntu berichtet worden, es ist beacause google ipv6 auf seinen Servern eingesetzt hat und ubuntu nicht, und dann wird der Fang nicht durchgeführt. Sie können es überprüfen mit:

+1

+1 für den Fehlerbericht – iabdalkader