memcpy Länge [Bug oder gewollt]?
-
Samstag, 14. Juli 2012 11:58
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?
Alle Antworten
-
Samstag, 14. Juli 2012 14:06
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
-
Samstag, 14. Juli 2012 14:22
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.
-
Samstag, 14. Juli 2012 14:57
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:03
- Bearbeitet Rudolf Meier Samstag, 14. Juli 2012 15:04
-
Samstag, 14. Juli 2012 15:31
Logg mal size :)
size ist wenns größer als 4 ist 0. Das ist das komische.
Aber ich benutze memcpy um speicherbereiche außerhalb meines Programmes zu ändern!
-
Samstag, 14. Juli 2012 15:47
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?
-
Samstag, 14. Juli 2012 17:54
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 BreitenhoferMicrosoft Contingent Staff, Moderator Freitag, 17. August 2012 09:27
-
Montag, 23. Juli 2012 13:04
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 Helge Kruse Dienstag, 24. Juli 2012 12:20
- Bearbeitet Helge Kruse Dienstag, 24. Juli 2012 12:22
- Als Antwort markiert Robert BreitenhoferMicrosoft Contingent Staff, Moderator Freitag, 17. August 2012 09:23
-
Freitag, 17. August 2012 09:27Besitzer
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.

