17 Stimmen

Erklären Sie den Stack-Überlauf und den Heap-Überlauf in der Programmierung mit einem Beispiel?

重複の可能性あり。
Was ist ein Stapelüberlauffehler?

Kann mir jemand sagen, wie und warum Stack Overflow und Heap Overflow in Programmen tatsächlich auftreten und wie man Stack Overflow in der Programmierung überwinden kann - wie man ihn vermeidet?

39voto

Jonathan Leffler Punkte 694013

Stapelüberlauf

void stack_overflow(const char *x)
{
    char y[3];
    strcpy(y, x);
}

Heap-Überlauf

void heap_overflow(const char *x)
{
    char *y = malloc(strlen(x));
    strcpy(y, x);
}

Analyse

Beide Funktionen trampeln über den zugewiesenen Raum hinaus.

Wenn Sie anrufen stack_overflow("abc") kopiert er 4 Zeichen (einschließlich der Null) in den für 3 Zeichen vorgesehenen Platz. Was danach geschieht, hängt davon ab, wo der Schaden entstanden ist. Die Variable y befindet sich auf dem Stapel, es handelt sich also um einen Stapelüberlauf.

Unabhängig davon, wie Sie die heap_overflow() wird ein Byte zu wenig aus dem Heap angefordert und dann über das Ende hinaus geschrieben. Das Heimtückische daran ist, dass es manchmal - sogar meistens - so aussieht, als würde es funktionieren, weil das Heap-System mehr Platz zuweist, als Sie anfordern. Es kann jedoch passieren, dass Sie auf Kontrolldaten herumtrampeln, und dann ist alles verloren.

Der Heap-Überlauf ist sehr klein und schwer zu erkennen. Der Stack-Überlauf kann klein (nicht existent, wenn die übergebene Zeichenkette kurz genug ist) oder dramatisch sein. Normalerweise sind die Auswirkungen dramatischer, wenn Sie über den zugewiesenen Speicherplatz hinaus schreiben, aber jedes Schreiben über den zugewiesenen Speicherplatz hinaus führt zu undefiniertem Verhalten - alles kann passieren.

Sie stellen sicher, dass es keine Probleme gibt, indem Sie wissen, wie groß das zu kopierende Objekt ist und wie viel Platz dafür zur Verfügung steht, und indem Sie darauf achten, dass Sie nicht mehr Material kopieren, als Platz vorhanden ist. Immer, jedes Mal.

4voto

Infinite Punkte 2968

Ein "Stapelüberlauf" unterscheidet sich von einem "stapelbasierten Pufferüberlauf". Ersterer ist auf zu tiefe Aktivierungssätze zurückzuführen, z. B. auf einen ununterbrochenen rekursiven Aufruf. Letzterer ist ein Softwarefehler, der auf eine unzureichende Grenzprüfung zurückzuführen ist und die am häufigsten ausgenutzte Sicherheitslücke darstellt.

-5voto

TonyK Punkte 16193

Stapelüberlauf:

 static void f(void) { f() ; }
 int main() { f() ; }

Heap-Überlauf:

 #include <stdlib.h>
 int main() { while (1) malloc (1000) ; }

bearbeiten Offensichtlich ist dies nicht die Bedeutung von Heap Overflow. Siehe Kommentare unten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X