Seite 1 von 1

[Anfänger] Hilfe bei valgrind

Verfasst: Mo Okt 14, 2013 3:42 pm
von Lirica
Hallo^^
Ich bräuchte ein bisschen Hilfe bei

==13459== Conditional jump or move depends on uninitialised value(s)
==13459== at 0x48E0175: strcpy (mc_replace_strmem.c:311)
==13459== by 0x804B5F3: defrag (1381761302.c:717)
==13459== by 0x8048EB5: main (1381761302.c:163)


Leider bin ich noch relativer C-Anfänger und kann daher nicht viel damit anfangen, wo jetzt der genaue Fehler ist. Wäre halt nett, wenn mir jemand den Fehler kurz erklären könnte und worin dieser besteht.

Code: Alles auswählen

auslesen = (char*) malloc(sizeStructure+1);
			if(auslesen == NULL){
				fclose(store);
				fclose(structure);
				free(save);
				return 66;		
			}


ablage = (char*) malloc(sizeStructure+1);
			if(ablage == NULL){
				fclose(store);
				fclose(structure);
				free(save);
				free(auslesen);
				free(darray);
				free(barray);
				return 66;		
			}


				// Dateien sichern
				fseek(structure, 0, SEEK_SET);
				fread(auslesen, sizeof(char), sizeStructure,structure);
				
				strcpy(ablage, auslesen);
				

Re: [Anfänger] Hilfe bei valgrind

Verfasst: Mo Okt 14, 2013 3:55 pm
von Xin
Mehr Information wäre nett. ^^

Um was für Daten handelt es sich? "sizeStructure" klingt nicht nach der Größe eines Strings, sonst hieß es wohl sizeString.

Da Du strcpy nimmst (String-Copy), ist eher unwahrscheinlich, dass das funktioniert. Nimm memcpy.

Re: [Anfänger] Hilfe bei valgrind

Verfasst: Mo Okt 14, 2013 4:03 pm
von Lirica
Hallo^^
Danke für deine schnelle Antwort!

Bei sizeStructure handelt es sich um die Größe der zu lesenden Datei, die ich halt zu anfang ermittle:

Code: Alles auswählen

//Groeße von Stucture ermitteln
		uint64_t sizeStructure;
			fseek( structure, 0, SEEK_END );	//ans Ende der Datei gehen
			sizeStructure = ftell( structure );	
			fseek(structure, 0, SEEK_SET); //wieder an den Dateianfang gehen
Es handelt sich um die Datei, die ich zunächst auslese und später wieder neu schreiben muss.

Re: [Anfänger] Hilfe bei valgrind

Verfasst: Mo Okt 14, 2013 4:26 pm
von Xin
Wenn es ein Text ist, sollte er keine Nullen enthalten, nur am Ende ist eine einzige 0. Daran orientiert sich strcpy.

Eine Struktur kann viele Nullen enthalten oder auch gar keine. Da ist nichts woran man sich orientieren kann. Darum musst Du bei memcpy die Länge explizit angeben, da strcpy sich nicht an den Nullen orientieren kann. Da kann auch so ein fehlerhafter Zugriff draus entstehen, weil er noch noch Nullen sucht, obwohl er gar nicht mehr in Deinen Daten unterwegs ist.

Ob die Daten jetzt von Festplatte kommen oder sonstwoher, spielt dabei erstmal keine Rolle.

Re: [Anfänger] Hilfe bei valgrind

Verfasst: Mo Okt 14, 2013 5:20 pm
von Lirica
Juhu! Es geht!^^
Wenn es nicht stört, würde ich noch gerne eine kleine Frage stellen.
Mir wird bei einer anderen Funktion ausgegeben:

==17267== Use of uninitialised value of size 4
==17267== at 0x49895BD: strtok (strtok.S:342)
==17267== by 0x8048A7C: main (1381767001.c:40)
==17267==
==17267== Conditional jump or move depends on uninitialised value(s)
==17267== at 0x49895C0: strtok (strtok.S:343)
==17267== by 0x8048A7C: main (1381767001.c:40)
==17267==
==17267== Conditional jump or move depends on uninitialised value(s)
==17267== at 0x49895DD: strtok (strtok.S:364)
==17267== by 0x8048A7C: main (1381767001.c:40)

In der Funktion wird sehr häufig strtok genutzt, sodass ich nicht so recht weiß, wo ich den Fehler suchen soll. Wie kann ich da am besten vorgehen? :/

Re: [Anfänger] Hilfe bei valgrind

Verfasst: Mo Okt 14, 2013 6:07 pm
von Xin
Lirica hat geschrieben:In der Funktion wird sehr häufig strtok genutzt, sodass ich nicht so recht weiß, wo ich den Fehler suchen soll. Wie kann ich da am besten vorgehen? :/
Mit Quelltext wäre das einfacher. Gib doch auch mal mit an, was eigentlich an strtok übergeben wird.

Re: [Anfänger] Hilfe bei valgrind

Verfasst: Mo Okt 14, 2013 6:19 pm
von Lirica
Ich nutze es halt um die Daten, die ich zeilenweise aus der Datei auslese, dann in den Speicher zu lesen.

Dies sieht dann ungefähr so aus:

Code: Alles auswählen

//erste Zeile auslesen
fgets(auslesen, sizeStructure, structure);
			zeiger1 = strtok(auslesen, "\n");
			zeiger2 = strtok(zeiger1, " ");
			bsize = strtod(zeiger2, &end);
			zeiger2 = strtok(NULL, " ");
			bcounter = strtod(zeiger2, &end);

Re: [Anfänger] Hilfe bei valgrind

Verfasst: Mo Okt 14, 2013 9:00 pm
von Lirica
Hallo!
malloc gegen calloc auszutauschen hat den Fehler behoben^^
Danke dir noch mal Xin, dass du mir so schnell und freundlich geholfen hast!

Re: [Anfänger] Hilfe bei valgrind

Verfasst: Di Okt 15, 2013 10:15 am
von Xin
Lirica hat geschrieben:Hallo!
malloc gegen calloc auszutauschen hat den Fehler behoben^^
Danke dir noch mal Xin, dass du mir so schnell und freundlich geholfen hast!
Ich hoffe Du hast verstanden, warum die Benutztung von malloc den Fehler verursacht hat. Ich sehe das hier nicht, dafür fehlt mir aber auch der Quelltext.
Wenn Du es nicht verstanden hast, würde ich malloc wieder einsetzen und das Debuggen, um den Fehler zu verstehen.