Was ist ein "Memory Stomp"?

95

Ich bin gerade auf diesen Blog-Beitrag gestoßen, in dem „Stomping Memory“ erwähnt wird:

Ein C ++ - Programm, das leicht in der Lage ist, Speicher zu stapeln (etwas, von dem Sie wahrscheinlich noch nie gehört haben, wenn Sie in einer verwalteten Codewelt geboren wurden.)

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

Also, was ist das, ein Gedächtnisstampfen, ein Stampfen der Erinnerung? Wann tritt es auf?

Scravy
quelle
4
Ein gutes Beispiel für einen Speicherstomp ist diese Frage: stackoverflow.com/questions/31016660/…
Phillip Ngan

Antworten:

117

Der Speicher wird "getrampelt", wenn ein Code den Speicher manipuliert, ohne zu bemerken, dass ein anderer Code diesen Speicher in einer widersprüchlichen Weise verwendet. Es gibt verschiedene Möglichkeiten, wie der Speicher gestapelt werden kann.

Man reserviert beispielsweise 100 Bytes Speicher, speichert dann aber etwas nach der 100. Adresse. Dieser Speicher kann verwendet werden, um etwas völlig anderes zu speichern. Dies ist besonders schwer zu debuggen, da das Problem auftritt, wenn etwas versucht, auf das Opfer zuzugreifen, auf das getreten wurde, und der Code, auf den getreten wurde, möglicherweise völlig unabhängig ist.

Ein anderer ist der Zugriff auf den Speicher, 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 verknüpft sein, das dieselbe Adresse hat und nicht mit dem Code zusammenhängt, der das Problem verursacht hat.

David Schwartz
quelle
3
Hier ist ein schönes Beispiel für Memory Stomping.
patryk.beza
33

Sehr oft ist es ein Pufferüberlauf; Als Beispiel dieser Code:

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

wird auf alles "stampfen", was gerade in der nächsten Sache in Erinnerung bleibt buffer. Im Allgemeinen ist "Stampfen", wenn der Speicher unbeabsichtigt beschrieben wird.

IronMensan
quelle
9

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 in eine Endlosschleife führen (oder auch nicht), da es sich um ein undefiniertes Verhalten handelt.

Sehr wahrscheinlich wird die Variable iim Speicher direkt nach dem Array gespeichert. Der Zugriff a[10]könnte also tatsächlich zugreifeni mit anderen Worten, er könnte den Schleifenzähler zurücksetzen.

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

ST3
quelle
1
Es gibt einen anderen Thread, der so ziemlich dasselbe Beispiel auf einem anderen Betriebssystem diskutiert ... stackoverflow.com/questions/31016660
Christian
2
@Christian Es hat nichts mit einem Betriebssystem zu tun. Dies ist ein undefiniertes Verhalten.
ST3