[Anfänger] Hilfe bei valgrind

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Lirica
Beiträge: 5
Registriert: Mo Okt 14, 2013 3:06 pm

[Anfänger] Hilfe bei valgrind

Beitrag von Lirica » Mo Okt 14, 2013 3:42 pm

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);
				

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: [Anfänger] Hilfe bei valgrind

Beitrag von Xin » Mo Okt 14, 2013 3:55 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Lirica
Beiträge: 5
Registriert: Mo Okt 14, 2013 3:06 pm

Re: [Anfänger] Hilfe bei valgrind

Beitrag von Lirica » Mo Okt 14, 2013 4:03 pm

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.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: [Anfänger] Hilfe bei valgrind

Beitrag von Xin » Mo Okt 14, 2013 4:26 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Lirica
Beiträge: 5
Registriert: Mo Okt 14, 2013 3:06 pm

Re: [Anfänger] Hilfe bei valgrind

Beitrag von Lirica » Mo Okt 14, 2013 5:20 pm

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? :/

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: [Anfänger] Hilfe bei valgrind

Beitrag von Xin » Mo Okt 14, 2013 6:07 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Lirica
Beiträge: 5
Registriert: Mo Okt 14, 2013 3:06 pm

Re: [Anfänger] Hilfe bei valgrind

Beitrag von Lirica » Mo Okt 14, 2013 6:19 pm

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);

Lirica
Beiträge: 5
Registriert: Mo Okt 14, 2013 3:06 pm

Re: [Anfänger] Hilfe bei valgrind

Beitrag von Lirica » Mo Okt 14, 2013 9:00 pm

Hallo!
malloc gegen calloc auszutauschen hat den Fehler behoben^^
Danke dir noch mal Xin, dass du mir so schnell und freundlich geholfen hast!

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: [Anfänger] Hilfe bei valgrind

Beitrag von Xin » Di Okt 15, 2013 10:15 am

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten