Che cosa è Stack Overflow?

June 25

Un overflow dello stack è un tipo di errore di programmazione che si verifica quando un programma tenta di allocare più memoria chiamata stack rispetto è disponibile. È un errore potenzialmente grave che causa il programma incriminato di crash e di solito è il risultato di uno dei due errori di progettazione.

la Pila

Lo stack si riferisce ad una sezione di memoria che viene utilizzata per memorizzare le informazioni sulle funzioni di un programma. Le dimensioni e dettagli tecnici dello stack saranno variare a seconda linguaggio di programmazione, il compilatore, il sistema operativo e il tipo di processore, e questi dettagli sono generalmente nascosto dal programmatore nella maggior parte dei linguaggi di livello superiore.

esempio Stack

Si consideri il seguente esempio in pseudocodice:

Funzione A {

1. call function b.
2. call function c.

}

Funzione B {

1. call function c.
2. Print Spot.

}

funzione C {

1. Print Run.

}

Dal momento che ogni funzione può chiamare altre funzioni, lo stack esiste per tenere traccia di dove nella funzione di genitore per continuare dopo una funzione figlio ritorni. In questo esempio, se fermato all'interno funzione C, può avere uno stack che simile a questa:

A1
---> B1
--------> C1

Dal momento che la prima linea di funzione A chiama la funzione B, e la prima riga della funzione B chiama la funzione C. Dopo la funzione C si concluderà, il programma continuerà back up della catena, in esecuzione B2 e infine A2.

Ricorsione infinita

Un overflow dello stack si verifica quando un programma tenta di archiviare troppe informazioni sullo stack. La causa più comune di un overflow dello stack è un errore di progettazione chiamato ricorsione infinita. Si consideri il seguente esempio in pseudocodice:

funzione A {

1. call function A.

}

E lo stack risultante:

-> A1
---> A1
--------> A1
--------------> A1
(e così via)

Coloro che hanno familiarità con la programmazione computer riconoscerà questo come una variazione sul ciclo infinito, ad eccezione, piuttosto che correre per sempre, questo programma finirà per consumare tutta la memoria sullo stack, risultante in un incidente e un errore di overflow dello stack.

Prevenzione

errori di overflow dello stack in genere si verificano quando si cerca di implementare algoritmi ricorsivi, e la chiave per evitare maggior parte degli errori è quello di garantire che il seguente vale per tutte le implementazioni ricorsive: la funzione ricorsiva deve contenere una condizione di uscita che non crea un altro strato di ricorsione; e la funzione ricorsiva deve essere progettato in modo che ogni strato di ricorsione aggiunto deve portare la funzione più vicino alla condizione di uscita.

Grandi variabili locali

Un altro, molto più rara causa di errori di overflow dello stack è la dichiarazione di grandi variabili locali, di solito sotto forma di matrici contenenti centinaia di migliaia, o milioni, di elementi. Il modo più semplice per evitare di overflow dello stack in questa situazione è quello di utilizzare puntatori e allocazione dinamica della memoria per evitare di dichiarare i dati nello stack quando le operazioni intensive come memoria sono chiamati per.