Nwlapcug.com


Come rilevare l'Overflow dello Stack

Come rilevare l'Overflow dello Stack


Linguaggi di programmazione si basano su una struttura di dati chiamata stack---alcuni esplicitare la sua presenza al programmatore, mentre tutti si basano su una pila per salti di programma che deve tornare al luogo dove il programma originale lasciato dopo aver eseguito una sorta di subroutine. Prima di trasferire il controllo al codice utente, un programma di imposta la dimensione massima per lo stack di chiamate, tra le altre preparazioni. A volte un programma viene interrotto a causa di un errore di segmentazione, che può essere causato da una varietà di fattori. È possibile rilevare facilmente è un overflow dello stack è alla radice del problema mediante un debugger.

Istruzioni

1

Ricompilare il programma che sta dando l'errore di segmentazione in modo che tutti i simboli di debug sono collegati in esso. Ad esempio, per un programma C++ su qualsiasi sistema operativo con la suite di strumenti GNU, eseguire:

"programma -g g + +. C -o programma"

dove il "-g" opzione indica al compilatore di includere i simboli di debug.

2

Eseguire il programma fino a quando si ferma a causa di un errore di segmentazione. Per esempio, eseguire:

"programma"

3

Richiamare il debugger sul programma subito dopo l'errore di segmentazione. Per esempio, eseguire:

"programma gdb"

4

Visualizzare un backtrace utilizzando il debugger. Tutti i debugger a livello sorgente hanno la capacità di visualizzare la catena di chiamate di funzione annidata al momento del crash del programma. Per il nostro esempio di "gdb", entrare dentro "gdb:"

"backtrace"

5

Esaminare il backtrace per i segni di una ricorsione infinita. È un nome di funzione singolo ripetuto più volte quanto sia necessario prima dell'incidente? Sono poche funzioni tra loro (ad esempio, mutua ricorsione) chiamata troppe volte prima dell'incidente? Se la risposta a delle domande è "Sì", il programma interrotto a causa di un overflow dello stack. La causa più probabile di stack overflow in linguaggi ad alto livello sono erroneamente codificati base casi.