Benutzer mit den meisten Antworten
memcpy Länge [Bug oder gewollt]?

Frage
-
Hey Leute^^
Hab in C++ mal ne schöne Libary geschrieben, unteranderem auch eine Funktion, die das benutzen von memcpy erleichtert.
Was mir aber dabei aufgefallen ist, ist wenn man eine Länge hat, die größer ist als 4, memcpy die automatisch auf 0 setzt o_0
Soll das so sein?
Antworten
-
Es sieht danach aus, als ob Dich der Debugger narrt. Bei dem Code
int size=7;
memcpy(foo, bar, size);wird die Variable mal kurz gesetzt und dann genau einmal verwendet. Da ist es wahrscheinlich, dass die Variable in einem Register ist, dass nach dem Aufruf von memcpy einen anderen Wert, z.B. 0 haben kann. Es würde mich nicht wundern, wenn es das Register ECX ist.
Was Du also also beschreibst, ist vielleicht etwas, das der Debugger dir anzeigt, aber nicht unbedingt, was das Programm macht. Auch wenn die Variable nicht "offiziell" aus dem Scope ist, wird sie nicht mehr benutzt. Daher darf der Compiler den Speicherort recyclen.
Poste doch mal den Code Deines memcpy-Wrappers, dann könnten wir das eher nachvollziehen.
- Als Antwort vorgeschlagen Harper23 Dienstag, 24. Juli 2012 12:20
- Bearbeitet Harper23 Dienstag, 24. Juli 2012 12:22
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 17. August 2012 09:23
-
Codeanalyse ohne den Code zu sehen ist schwierig... aber, ich denke ich versteh's jetzt.
Lass bei den ersten zwei Parametern von memcpy die & vorne dran weg.
Rudolf
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 17. August 2012 09:27
Alle Antworten
-
Hallo
"Länge grösser 4" meint wohl du willst mehr als 4 Byte kopieren, nehme ich mal an?
memcpy setzt "die" auf 0 ... was ist "die" ? "die" Länge, "die" Bytes (wenn ja, welche? vorne, hinten, source, target?), "die" Kartoffeln? ...
mangels Informationen weise ich einfach mal auf die häufigsten Fehler im Zusammenhang mit memcpy hin
1) du schreibst über den Puffer hinaus
2) du liest von der falschen Stelle
3) du schreibst in den selben Puffer aus dem du ausliest -> dann solltest du memmove verwenden
Zudem... reden wir von memcpy oder von memcpy_s ?? und was tut deine Library?
Rudolf
-
Hallo
"Länge grösser 4" meint wohl du willst mehr als 4 Byte kopieren, nehme ich mal an?
memcpy setzt "die" auf 0 ... was ist "die" ? "die" Länge, "die" Bytes (wenn ja, welche? vorne, hinten, source, target?), "die" Kartoffeln? ...
mangels Informationen weise ich einfach mal auf die häufigsten Fehler im Zusammenhang mit memcpy hin
1) du schreibst über den Puffer hinaus
2) du liest von der falschen Stelle
3) du schreibst in den selben Puffer aus dem du ausliest -> dann solltest du memmove verwenden
Zudem... reden wir von memcpy oder von memcpy_s ?? und was tut deine Library?
Rudolf
Vielen Dank.
memcpy setzt die Länge auf 0. Das ist das, was ich nicht verstehe. Das sollte memcpy nicht machen. Wir reden von memcpy.
Die Libary ist ne Helfer Libary für andere Programme, die viele Windowsfunktionen "ersetzt" also leichter macht.
-
Was heisst das? Es kopiert nichts?
Nebenbei -> memcpy ist eine Funktion der CRT (C-Runtime) und nicht von Windows ... es gibt zwar die Win API Funktion CopyMemory, welche ein memcpy ist... aber das mal nur am Rande.
Also... machen wir mal ein Beispiel:
char* einString = "irgendwas";
void* buf = malloc(293); // Puffer mit 293 Bytes
int size = 7;
memcpy(buf, einString + 1, size);
-> Resultat: in den Puffer wurde "rgendwa" kopiert ... und zwar ganz an den Anfang... was soll nun 0 sein?
- Bearbeitet Rudolf Meier Samstag, 14. Juli 2012 15:04
-
sorry, ich versteh nur Bahnhof ...
1) Logg -> ist das überhaupt ein Wort? was bedeutet das?
2) "size ist wenns größer als 4 ist 0" -> nein, denn für jedes a > 4 gilt auch a > 0 , weil 4 > 0 gilt und wenn a > 0 gilt, dann kann a == 0 nicht gleichzeitig gelten... size kann also nicht 0 sein
3) du kannst Speicherbereite nur in dem Adressraum ändern, in dem du bist... das heisst zwar nicht, dass du nur Speicher verändern kannst, dessen Allokation du selber programmiert hast, aber sie hat sicher in deinem Adressraum stattgefunden oder wurde in diesen gamappt... ... also, was meinst du mit "außerhalb" deines Programmes?
-
Codeanalyse ohne den Code zu sehen ist schwierig... aber, ich denke ich versteh's jetzt.
Lass bei den ersten zwei Parametern von memcpy die & vorne dran weg.
Rudolf
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 17. August 2012 09:27
-
Es sieht danach aus, als ob Dich der Debugger narrt. Bei dem Code
int size=7;
memcpy(foo, bar, size);wird die Variable mal kurz gesetzt und dann genau einmal verwendet. Da ist es wahrscheinlich, dass die Variable in einem Register ist, dass nach dem Aufruf von memcpy einen anderen Wert, z.B. 0 haben kann. Es würde mich nicht wundern, wenn es das Register ECX ist.
Was Du also also beschreibst, ist vielleicht etwas, das der Debugger dir anzeigt, aber nicht unbedingt, was das Programm macht. Auch wenn die Variable nicht "offiziell" aus dem Scope ist, wird sie nicht mehr benutzt. Daher darf der Compiler den Speicherort recyclen.
Poste doch mal den Code Deines memcpy-Wrappers, dann könnten wir das eher nachvollziehen.
- Als Antwort vorgeschlagen Harper23 Dienstag, 24. Juli 2012 12:20
- Bearbeitet Harper23 Dienstag, 24. Juli 2012 12:22
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 17. August 2012 09:23
-
Hallo Ch40zz-C0d3r,
Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.Grüße,
RobertRobert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.