Nwlapcug.com


Che cosa è Overflow dello Stack?

Un overflow dello stack è un tipo di errore di programmazione che si verifica quando un programma tenta di allocare più memoria rispetto a quella disponibile nello stack di chiamate. È un errore potenzialmente grave che causa il crash del programma incriminato ed è solitamente il risultato di uno dei due design errori.

Lo Stack

Lo stack fa riferimento a una sezione di memoria che viene utilizzata per memorizzare le informazioni sulle funzioni di un programma. Le dimensioni e i dettagli tecnici dello stack sarà variano a seconda del linguaggio di programmazione, compilatore, sistema operativo e tipo di processore, e questi dettagli sono generalmente nascosti dal programmatore in linguaggi di livello più superiore.

Esempio di Stack

Consideriamo il seguente esempio in pseudocodice:

funzione a () {

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

}

funzione b {

1. call function c.
2. Print Spot.

}

Function () {c

1. Print Run.

}

Dato che ogni funzione può chiamare altre funzioni, lo stack esiste per tenere traccia di dove la funzione di padre per continuare dopo una funzione figlio restituisce. In questo esempio, se fermato all'interno di funzione c, potrebbe essere una pila che assomigli a questo:

A1
---> B1
---> C1

Poiché la prima linea della funzione una chiama la funzione B, e la prima linea di chiamate di funzione B funzione C. Dopo la funzione C verrà completata, il programma continuerà indietro fino alla 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 una ricorsione infinita. Consideriamo 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 di computer questo riconoscerà come una variazione sul loop infinito, ad eccezione, piuttosto che correre per sempre, questo programma sarà infine consumare tutta la memoria nello stack, causando un arresto anomalo e un errore di overflow dello stack.

Prevenzione

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

Grandi dimensioni variabili locali

Un altro, molto più rara causa di errori di overflow dello stack è la dichiarazione delle variabili locali grandi, solitamente sotto forma di matrici che contengono 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 allocazione dinamica della memoria per evitare di dichiarare i dati nello stack quando tali operazioni intensivo di memoria vengono chiamati per.