none
memcpy Länge [Bug oder gewollt]? RRS feed

  • 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?

    Samstag, 14. Juli 2012 11:58

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.


    Montag, 23. Juli 2012 13:04
  • 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

    Samstag, 14. Juli 2012 17:54

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

    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

    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:22
  • 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?


    Samstag, 14. Juli 2012 14:57
  • 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:31
  • 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 15:47
  • 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

    Samstag, 14. Juli 2012 17:54
  • 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.


    Montag, 23. Juli 2012 13:04
  • 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,
    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    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.

    Freitag, 17. August 2012 09:27
    Moderator