Un overflow dello stack è un tipo di errore di programmazione che si verifica quando un programma tenta di allocare più memoria sullo stack di chiamate di quella disponibile . E '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
La pila si riferisce ad una sezione di memoria che viene utilizzata per memorizzare le informazioni sulle funzioni di un programma . Le dimensioni e dettagli tecnici della pila saranno variano a seconda del linguaggio di programmazione , compilatore , il sistema operativo e il tipo di processore , e questi dettagli sono generalmente nascosti al programmatore nella maggior parte dei linguaggi di alto livello .
Esempio Stack
Si consideri il seguente esempio in pseudocodice :
funzione
a { 1 . funzione b.2 chiamare . chiamare la funzione c . }
funzione b { 1 . funzione c.2 chiamare . Stampa Spot . }
Funzione c { 1 . Tiratura . }
Dal momento che ogni funzione può chiamare altre funzioni , la pila esiste per tenere traccia di dove nella funzione di genitore di continuare dopo che un bambino funzione restituisce. Questo esempio , se si fermò all'interno funzione c , può avere uno stack che sembra qualcosa di simile :
> A1 ---> B1 -------- > C1
< p > Dal momento che la prima riga della funzione Una funzione chiamate B , e la prima linea della funzione B chiamate di funzione C. Dopo la funzione C si concluderà , il programma continuerà il backup della catena , in esecuzione B2 e infine A2 .
Infinite ricorsione
un overflow dello stack si verifica quando un programma tenta di archiviare troppe informazioni nello 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 . funzione A. }
E la pila risultante chiamare :
- > A1 ---> A1 -------- > A1 ------- ------- > A1 (e così via ) per
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 finalmente consumare tutto la memoria sullo stack , causando una caduta e un errore di overflow dello stack .
prevenzione
errori di overflow dello stack in genere si verificano quando si tenta di implementare algoritmi ricorsivi , e la chiave per evitare la maggior parte degli errori è quello di garantire che la seguente è vero 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 variabili locali di grandi dimensioni , di solito in forma di matrici contenenti centinaia di migliaia, o milioni , di elementi . Il modo più semplice per evitare overflow dello stack in questa situazione è quello di utilizzare i puntatori e l'allocazione dinamica della memoria per evitare di dichiarare i dati nello stack quando tali operazioni intensivo della memoria si impone.