Was ist ein „Memory Stomp“?

Lesezeit: 2 Minuten

Benutzeravatar von scravy
schäbig

ich bin gerade gekommen über diesen Blogbeitrag was “stampfende Erinnerung” erwähnt:

ein C++-Programm, das leicht in der Lage ist, Speicher zu stampfen (etwas, von dem Sie wahrscheinlich noch nie gehört haben, wenn Sie in einer Welt mit verwaltetem Code geboren wurden).

Und tatsächlich habe ich noch nie davon gehört!

Also, was ist das, ein Erinnerungsstampf, eine stampfende Erinnerung? Wann tritt es auf?

  • Ein gutes Beispiel für einen Memory Stomp ist diese Frage: stackoverflow.com/questions/31016660/…

    – Philipp Ngan

    24. Juni 2015 um 5:44 Uhr


Der Speicher wird “gestampft”, wenn ein Stück Code den Speicher manipuliert, ohne zu erkennen, dass ein anderer Code diesen Speicher auf eine widersprüchliche Weise verwendet. Es gibt mehrere übliche Wege, wie das Gedächtnis zertrampelt werden kann.

Man weist beispielsweise 100 Byte Speicher zu, speichert dann aber etwas nach der 100. Adresse. Diese Erinnerung könnte verwendet werden, um etwas völlig anderes zu halten. Dies ist besonders schwer zu debuggen, da das Problem auftritt, wenn versucht wird, auf das Opfer zuzugreifen, auf das getreten wurde, und der Code, der darauf getreten wurde, möglicherweise völlig unabhängig davon ist.

Ein anderer greift auf Speicher zu, nachdem er freigegeben wurde. Der Speicher kann einem anderen Objekt zugewiesen werden. Auch hier kann der Code, der das Problem anzeigt, mit dem neu zugewiesenen Objekt zusammenhängen, das dieselbe Adresse erhalten hat, und nichts mit dem Code zu tun haben, der das Problem verursacht hat.

  • Hier ist ein schönes Beispiel für Memory Stampfen.

    – patryk.beza

    22. Juli 2015 um 21:42 Uhr


Benutzeravatar von IronMensan
IronMensan

Sehr oft handelt es sich um einen Pufferüberlauf; als Beispiel dieser Code:

char buffer[8];
buffer[8] = 'a';

wird auf dem “stampfen”, was auch immer als nächstes in der Erinnerung ist buffer. Im Allgemeinen spricht man von „Stampfen“, wenn unbeabsichtigt in den Speicher geschrieben wird.

Benutzeravatar von ST3
ST3

Andere Antworten sind grundsätzlich richtig, aber ich möchte ein Beispiel geben.

int a[10], i;       
for (i = 0; i < 11 ; i++)
    a[i] = 0;

int i, a[10];     
for (i = 0; i < 11 ; i++)
    a[i] = 0;

Diese Samples können zu einer Endlosschleife führen (oder auch nicht), da es sich um ein undefiniertes Verhalten handelt.

Sehr wahrscheinlich variabel i im Speicher wird direkt nach dem Array gespeichert. Also zugreifen a[10] eigentlich zugreifen konnte i mit anderen Worten, es könnte den Schleifenzähler zurücksetzen.

Ich denke, es ist ein gutes Beispiel, das das “Stampfen” des Gedächtnisses demonstriert.

  • Es gibt einen anderen Thread, in dem so ziemlich dasselbe Beispiel auf verschiedenen Betriebssystemen diskutiert wird … stackoverflow.com/questions/31016660

    – Christian

    21. Juli 2015 um 22:45 Uhr

  • @Christian Es hat nichts mit einem Betriebssystem zu tun. Dies ist ein undefiniertes Verhalten.

    – ST3

    22. Juli 2015 um 6:25 Uhr

1421010cookie-checkWas ist ein „Memory Stomp“?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy