PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Memory Leak?



Badsteve
21-07-2003, 14:09
Ich habe ein Problem, splint meldet bei dem Code 2 Memory leaks. Ich sehe da aber keine. Ich habe noch eine 2te Version geschrieben, da wird nur 1 Memory-Leak gemeldet, vielleicht könnt ihr mir ja helfen:


int main(int argc, char *argv[])
{
int sockfd, n;
struct addrinfo hints, *res, *ressave;

if( argc != 3)
{
fprintf(stderr, "usage: %s host port\n", argv[0]);
return -1;
}
memset(&hints, 0, sizeof(struct addrinfo));

hints.ai_family= AF_INET;
hints.ai_socktype = SOCK_STREAM;

if( (n = getaddrinfo(argv[1], argv[2], &hints, &res)) != 0)
{
fprintf(stderr, "error for %s, %s : %s\n", argv[1], argv[2], gai_strerror(n));
return -1;
}

ressave = res;

do
{
sockfd = socket(res->ai_family, res-> ai_socktype, res->ai_protocol);
if( sockfd < 0)
continue;

if( connect(sockfd, res->ai_addr, res->ai_addrlen) == 0)
break;
close(sockfd);
} while ((res = res->ai_next) != NULL);

if(res == NULL)
{
fprintf(stderr, "socket/connect failed\n");
return -1;
}

freeaddrinfo(ressave);
shell(sockfd);

close(sockfd);

return 0;
}


Ein Memory-Leak wird in Verbindung mit hints angezeigt und eins bei gai_strerror(n).



int main(int argc, char *argv[])
{
int sockfd, n;
struct addrinfo *hints, *res, *ressave;



if( argc != 3)
{
fprintf(stderr, "usage: %s host port\n", argv[0]);
return -1;
}


hints= (struct addrinfo *)malloc(sizeof(struct addrinfo));
memset(hints, 0, sizeof(struct addrinfo));

hints->ai_family= AF_INET;
hints->ai_socktype = SOCK_STREAM;

if( (n = getaddrinfo(argv[1], argv[2], hints, &res)) != 0)
{
fprintf(stderr, "error for %s, %s : %s\n", argv[1], argv[2], gai_strerror(n));
free(hints);
return -1;
}

ressave = res;

do
{
sockfd = socket(res->ai_family, res-> ai_socktype, res->ai_protocol);
if( sockfd < 0)
continue;

if( connect(sockfd, res->ai_addr, res->ai_addrlen) == 0)
break;
close(sockfd);
} while ((res = res->ai_next) != NULL);

if(res == NULL)
{
fprintf(stderr, "socket/connect failed\n");
free(hints);
return -1;
}

free(hints);
freeaddrinfo(ressave);
shell(sockfd);

close(sockfd);

return 0;
}


hier wird nur noch ein Memory-Leak bei gai_strerror(n) angezeigt.

danke - Steve

PS welche Version ist denn überhaupt besser, die 1te oder die 2te ?

anda_skoa
21-07-2003, 16:10
Hmm, vielleicht erzeugt gai_strerror den Rückgabestring mit malloc und du musst ihn freigeben.

Ließe sich einfach testen, wenn du zwei mal gai_strerror mit den selben Error Code aufrufst und dabei zwei verschiedene Pointer erhältst.

Ciao,
_

Badsteve
21-07-2003, 17:04
Er nutzt malloc noch calloc. Hab ich gestestet und hier noch ein Link dazu :
http://cvs.parisc-linux.org/glibc/sysdeps/posix/gai_strerror.c?annotate=1.1&only_with_tag=current

Was ist mit dem anderen Leak ?

Steve

anda_skoa
21-07-2003, 18:01
Original geschrieben von Badsteve

Was ist mit dem anderen Leak ?


Die Struktur ist am Stack, sollte also selbst nicht leaken.

Aber sie enthält Pointer, die vielleicht gelöscht werden müssen.

Ciao,
_

Badsteve
21-07-2003, 19:34
gut

danke - Steve