Badsteve
21-07-2003, 15: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 ?
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 ?