Che cosa è Stack Overflow in Linea 42?

March 14

Un overflow dello stack si verifica quando lo stack, una struttura di dati critici si trovano in ogni programma in esecuzione, ha superato i suoi limiti di memoria. Questa condizione ha diverse cause, tutti sintomi di errori di programmazione. Se l'errore si verifica in un programma di origine commerciale o aperta, contatta l'assistenza tecnica. Se il problema si verifica durante il test il proprio codice, qui sono alcuni dei problemi più comuni che possono essere avvenuta in linea 42.

sfondo

Lo stack di chiamate, la causa più comune di overflow dello stack, contiene un elenco degli indirizzi di ritorno di ogni chiamata di funzione o di un metodo. Quando il programma inizia, lo stack di chiamate è vuoto, poi, quando la prima funzione viene chiamata, l'indirizzo della linea immediatamente dopo la chiamata di funzione viene spinto in pila. Quando la funzione completa, l'indirizzo del mittente viene estratto dallo stack e l'esecuzione continua a questo indirizzo. Lo stack si espande e crolla a seconda del numero di chiamate di funzione nidificate.

ricorsione

Ricorsione si verifica quando una funzione chiama se stessa. Si consideri il seguente codice:

countNodes Function (nodo)
Per ogni nodo in childNode

nodeCount += 1
countNodes(childNode)

prossimo
funzione fine

Utilizzando una sorta di struttura albero come un documento XML, questo codice conta il numero di nodi dell'albero trovati sotto un dato nodo. Ogni nodo figlio viene contato, poi viene passato alla stessa funzione per contare i propri nodi figli. Questo continua fino a quando un bambino non ha figli.

Supponiamo che il nodo programmatore digitato anziché nodo figlio come segue:

countNodes Function (nodo)
Per ogni nodo in childNode

nodeCount += 1
countNodes(Node)

prossimo
funzione fine

In questo caso, la funzione chiamerà indefinitamente e si verifica un overflow dello stack.

ricorsione Hidden

Nella maggior parte dei casi, gli sviluppatori non stanno scrivendo intenzionalmente codice ricorsivo, ma ricorsione possono verificarsi in modi più sottili. Considerate queste tre funzioni:

loadAccount function ()
LoadMainAccount ()
loadTransactions ()

funzione fine

loadMainAccount function ()
loadAssociatedAccounts ()
end function

loadAssociatedAccounts function ()
loadAccount ()
end function

In questo caso, si verifica ricorsione indirettamente quando una funzione chiama un'altra funzione che chiama inavvertitamente la prima funzione. Il risultato può prendere un po 'di più, ma il risultato è un overflow dello stack.

Parametri di grandi dimensioni

Oltre monitoraggio punti di ritorno chiamata di funzione, lo stack può anche contenere altri dati. La maggior parte delle lingue usano la pila di tenere i parametri di funzione e queste sono di solito solo i puntatori degli indirizzi dei luoghi di parametri. Alcune lingue spingono parametri per valore nello stack e questo può richiedere molto più spazio. La dimensione dello stack di default per la maggior parte delle lingue variano da 512K a 1MB, così grandi parametri passati per valore potrebbero occasionalmente causare uno stack overflow. Se vi è la necessità di passare grandi parametri per valore, consultare il manuale di riferimento di lingua per determinare come aumentare lo stack.

Variabili di istanza

Le variabili di istanza sono quelli incorporati all'interno della funzione. Per esempio:

campione function ()
N = getCounter ()
Rientro n * 12
funzione fine

La variabile n è una variabile di istanza in quanto esiste solo mentre il campione funzione esegue. In molte lingue, n viene inserito nello stack, poi spuntato fuori quando la funzione termina. Questo funziona bene per le variabili semplici come interi e caratteri, ma può riempire lo stack quando si utilizzano matrici di grandi dimensioni. Quando questo diventa un problema, considerare l'utilizzo di strutture di dati built-in come stringhe o elenchi. Queste strutture solitamente allocano memoria sul mucchio, un separato, molto più grande area di memoria.