mehrere valgrind Fehler: Bedingter Sprung oder Bewegung ist abhängig von uninitialised Wert (e)

StackOverflow https://stackoverflow.com/questions/2679661

  •  30-09-2019
  •  | 
  •  

Frage

Ich bin mit Valgrind und ich erhalte die folgende Fehlermeldung (dies ist nicht die einzige):

==21743== Conditional jump or move depends on uninitialised value(s)
==21743==    at 0x4A06509: index (mc_replace_strmem.c:164)
==21743==    by 0x33B7CBB3CD: gaih_inet (in /lib64/libc-2.5.so)
==21743==    by 0x33B7CBD629: getaddrinfo (in /lib64/libc-2.5.so)
==21743==    by 0x401A5F: tunnelURL (proxy.c:336)
==21743==    by 0x40142A: client_thread (proxy.c:194)
==21743==    by 0x33B8806616: start_thread (in /lib64/libpthread-2.5.so)
==21743==    by 0x33B7CD3C2C: clone (in /lib64/libc-2.5.so)

Meine tunnelURL() Funktion sieht wie folgt aus (C-Code):

char * tunnelURL(char *url) {
 char * a = strstr(url, "//");
 a += 2;
 char * path = strstr(a, "/");

 char host[256];
 strncpy (host, a, strlen(a)-strlen(path));

 /*
  * The following is courtesy of Beej's Guide
  */
 int status;
 int proxySocketFD;
 struct addrinfo hints;
 struct addrinfo *servinfo; // will point to the results

 memset(&hints, 0, sizeof(hints)); // make sure the struct is empty
 hints.ai_family = AF_INET; // don't care IPv4 or IPv6
 hints.ai_socktype = SOCK_STREAM; // TCP stream sockets
 hints.ai_flags = AI_PASSIVE; // fill in my IP for me

 if ((status = getaddrinfo(host, "80", &hints, &servinfo)) != 0) {
  perror("getaddrinfo() fail");
  exit(1);
 }

 // create socket
 if ((proxySocketFD = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol)) == -1) {
  perror("proxy socket() fail");
  exit(1);
 }

 // connect
 if (connect(proxySocketFD, servinfo->ai_addr, servinfo->ai_addrlen) != 0) {
  printf("connect() fail");
  exit(1);
 }

 // construct request
 char request[strlen(path) + strlen(host) + 26];
 sprintf(request, "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n", path, host);
 printf("%s", request);

 // send request
 send(proxySocketFD, request, strlen(request), 0);

 // receive response
 int i = 0;
 int amntRecvd = 0;
 char *pageContentBuffer = (char*) malloc(4096 * sizeof(char));
 while ((amntRecvd = recv(proxySocketFD, pageContentBuffer + i, 4096, 0)) > 0) {
  i += amntRecvd;
  realloc(pageContentBuffer, i * 4096 * sizeof(char));
 }

 // close proxy socket
 close(proxySocketFD);

 // deallocate memory
 freeaddrinfo(servinfo);

 return pageContentBuffer;

}

Linie 336 entspricht die if Anweisung mit dem getaddrinfo() Funktionsaufruf. Ich bin nicht wirklich sicher, was ich nicht initialisiert haben. Die Zeichenfolge ich vorbei bin in sein „sollte“ bereits festgelegt. Ich drucke es ganz gut aus. Ich habe auch einen anderen Fehler auf der gleichen Codezeile entsprechen:

==21743== Use of uninitialised value of size 8
==21743==    at 0x33B7D05816: __nscd_cache_search (in /lib64/libc-2.5.so)
==21743==    by 0x33B7D0438B: nscd_gethst_r (in /lib64/libc-2.5.so)
==21743==    by 0x33B7D04B26: __nscd_gethostbyname2_r (in /lib64/libc-2.5.so)
==21743==    by 0x33B7CE9F5E: gethostbyname2_r@@GLIBC_2.2.5 (in /lib64/libc-2.5.so)
==21743==    by 0x33B7CBC522: gaih_inet (in /lib64/libc-2.5.so)
==21743==    by 0x33B7CBD629: getaddrinfo (in /lib64/libc-2.5.so)
==21743==    by 0x401A5F: tunnelURL (proxy.c:336)
==21743==    by 0x40142A: client_thread (proxy.c:194)
==21743==    by 0x33B8806616: start_thread (in /lib64/libpthread-2.5.so)
==21743==    by 0x33B7CD3C2C: clone (in /lib64/libc-2.5.so)

Alle Ideen, was könnte dies becausing?

War es hilfreich?

Lösung

Sie verwenden realloc() nicht korrekt. realloc() kann den zugeordneten Block verschieben, und es gibt die neue Adresse des Blockes -., so dass Sie, dass der Rückgabewert pageContentBuffer zuweisen müssen (iff es nicht NULL ist)

Andere Tipps

 // receive response
 int i = 0;
 int amntRecvd = 0;
 char *pageContentBuffer = (char*) malloc(4096 * sizeof(char));
 while ((amntRecvd = recv(proxySocketFD, pageContentBuffer + i, 4096, 0)) > 0) {
  i += amntRecvd;
  realloc(pageContentBuffer, i * 4096 * sizeof(char));
 }

realloc(pageContentBuffer, i * 4096 * sizeof(char)) sieht nicht richtig aus. Wenn Sie 4096 Bytes zuerst empfangen, werden Sie als nächstes 4096 * 4096 Bytes werden Zuweisung, 2 * 4096 * 4096 Bytes nächsten und so weiter. Vielleicht bedeutete Sie dazu?

Der erste bedingte Sprungfehler in Ihrer Frage angezeigt ist wegen Sie strncpy falsch verwenden. Es wird die kopierte Zeichenfolge nicht beenden, Sie, dass nachträglich manuell zu tun haben. Besser als zu verwenden Memcpy.

char host[256];
int n = strlen(a)-strlen(path);
memcpy (host, a, n);
host[n] = '\0';
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top