Stack overflow: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 1:
In [[informatica]], uno '''stack overflow''' avviene quando è richiesto l'uso di una quantità troppo elevata di [[Memoria (informatica)|memoria]] nello '''''[[Allocazione_dinamica_della_memoria#Stack_e_heap|stack]]'''''.
 
In molti [[linguaggi di programmazione]], lo [[stack delle chiamate]] contiene una quantità limitata di memoria, che viene fissata di solito all'avvio del programma. La dimensione dello stack dipende da molteplici fattori, inclusi il linguaggio di programmazione, l'[[Architettura (computer)|architettura]] della macchina, l'uso del [[multithreading]] e la disponibilità di memoria nel sistema. Quando vieneè usata troppa memoria nello '''''stack''''' si dice che avviene un '''''overflow''''', e tipicamente come conseguenza di questa situazione si verifica un [[Crash (informatica)|crash]] del programma<ref name="fortran1"> {{Cita web
| cognome = Burley
| nome = James Craig
Riga 17:
La causa più comune di uno stack overflow è una [[ricorsione]] con profondità eccessiva o infinita.
 
I linguaggi che implementano la tecnica [[Algoritmo_ricorsivo#Eliminazione_della_ricorsione|tail recursion]], come ad esempio il linguaggio [[Scheme]], permettono una particolare ricorsione infinita che possapuò essere eseguita senza stack overflow. Questo avviene poiché le chiamate che fanno uso di tail-recursion non richiedono uno spazio aggiuntivo nello stack<ref name="tailRecur">{{Cita web
| titolo = An Introduction to Scheme and its Implementation
| url=http://www.federated.com/~jim/schintro-v14/schintro_73.html
Riga 24:
 
==Variabili di stack molto grandi==
L'altra causa principale dello ''stack overflow'' è il tentativo di allocare più memoria nello stack di quella che èdisponibile disponibilenello stack. Questo avviene tipicamente quando si crea un [[array]] di [[Variabile (informatica)#Visibilità di una variabile|variabili locali]] molto grande. Per questo motivo gli array più grandi di qualche [[kilobyte]] dovrebbero essere allocati [[allocazione dinamica della memoria|dinamicamente]] anziché allocarli come variabili locali<ref name="onlamp">{{Cita web
| cognome = Feldman
| nome = Howard
Riga 34:
Gli ''stack overflow'' sono aggravati da qualsiasi cosa riduca la dimensione effettiva dello ''stack'' di un programma.
 
Ad esempio un programma che viene eseguito come ''[[Thread (informatica)|thread]]'' singolo potrebbe funzionare correttamente, ma se lo stesso programma vieneè eseguito con thread multipli si verifica un ''crash'' del programma. Ciò avviene, perché molti programmi che usano i thread hanno a disposizione uno stack più piccolo per ogni singolo thread rispetto ad un programma che non usi i thread.
 
Allo stesso modo, lechi personestudia che si avvicinano allolo [[sviluppo (informatica)| sviluppo]] di un [[kernel]] sonoè invitateinvitato a non usare [[algoritmo ricorsivo|algoritmi ricorsivi]] e [[buffer]] molto grandi nello stack<ref name="apple1">{{Cita web
| editore= [[Apple Inc]].
| titolo = Kernel Programming Guide: Performance and Stability Tips