Selon Valgrind, getaddrinfo perd de la mémoire?

J’ai exécuté Valgrind sur notre projet et Valgrind a signalé que la mémoire avait été perdue suite à un appel à getaddrinfo, alors que freeaddrinfo avait été appelé au bas de la fonction. Une idée de ce qui pourrait causer cela?

int tcp_connect(char *address, char *port) { //printf("%s\n ", address); int status, sockfd; struct addrinfo hints, *servinfo, *p; memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype= SOCK_STREAM; status = getaddrinfo(address,port,&hints,&servinfo); if(status != 0){ printf("tcpconnect: getaddrinfo failed\n"); } for(p = servinfo; p != NULL; p = p->ai_next) { sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol); if(sockfd == -1){ printf("tcpconnect: socket failed\n"); continue; } status = connect(sockfd, p->ai_addr, p->ai_addrlen); if(status == -1){ close(sockfd); printf("tcpconnect: connect failed\n"); continue; } break; } if (p == NULL){ printf("tcpconnect: could not get a valid socket file descriptor\n"); return -1; } freeaddrinfo(servinfo); //return socket return sockfd; } 

La sortie de valgrind est ici:

 ==7803== 384 bytes in 8 blocks are definitely lost in loss record 30 of 37 ==7803== at 0x4023CC8: malloc (vg_replace_malloc.c:236) ==7803== by 0x413FE46: gaih_inet (in /lib/libc-2.7.so) ==7803== by 0x4141CA1: getaddrinfo (in /lib/libc-2.7.so) ==7803== by 0x804D20D: tcp_connect (tcpconnect.c:18) ==7803== by 0x804D505: update_radio_data_t (radiodata.c:69) ==7803== by 0x4073368: start_thread (in /lib/libpthread-2.7.so) ==7803== by 0x4159CFD: clone (in /lib/libc-2.7.so) 

Je suis dérouté par cette fuite de mémoire, car je me suis assuré de faire appel à freeaddrinfo en bas. Est-ce que cela pourrait être un bug dans Valgrind ou freeaddrinfo?

Votre chemin d’échec ( if (p == NULL) ) n’appelle pas freeaddrinfo , je déplacerais l’appel avant la vérification.

 if (p == NULL){ printf("tcpconnect: could not get a valid socket file descriptor\n"); return -1; } 

Si cette condition est toujours vraie, freeaddrinfo(servinfo) ne sera pas appelé.