Stack overflow: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
SieBot (discussione | contributi)
Atarubot (discussione | contributi)
m Cite (book, journal) -> Cita (libro, pubblicazione) using AWB
Riga 1:
In [[informatica]] uno '''stack overflow''' avviene quando è richiesto l'uso di una quantità troppo elevata di [[Memoria (informatica)|memoria]] nello [[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"> {{citeCita web
| lastcognome = Burley
| firstnome = James Craig
| titletitolo = Using and Porting GNU Fortran
| url= http://sunsite.ualberta.ca/Documentation/Gnu/gcc-2.95.2/html_node/g77_597.html
| date data=1 giugno 1991-06-01 }}</ref>. Questa classe di [[bug]] solitamente è causata da uno dei due tipi di errori di programmazione<ref name="devx">
{{citeCita web
| lastcognome = Danny
| firstnome = Kalev
| titletitolo = Understanding Stack Overflow
| url=http://www.devx.com/tips/Tip/14276
| date data=5 settembre 2000-09-05 }}</ref>: la ricorsione infinita e l'uso di variabili di stack molto grandi.
 
==Ricorsione infinita==
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 possa 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">{{citeCita web
| titletitolo = An Introduction to Scheme and its Implementation
| url=http://www.federated.com/~jim/schintro-v14/schintro_73.html
| date data=19 febbraio 1997-02-19 }} </ref>
.
 
==Variabili di stack molto grandi==
L'altra causa principale dello ''stack overflow'' è il tentativo di allocare più memoria nello stack di quella che è disponibile. 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">{{citeCita web
| lastcognome = Feldman
| firstnome = Howard
| titletitolo = Modern Memory Management, Part 2
| url=http://www.onlamp.com/pub/a/onlamp/2005/11/23/memory-management-2.html
| date data=23 novembre 2005-11-23 }} </ref>.
 
== Cause che possono ridurre la dimensione dello stack disponibile e quindi rendere più probabile uno ''stack overflow'' ==
Riga 36:
Ad esempio un programma che viene eseguito come ''[[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, le persone che si avvicinano allo [[sviluppo (informatica)| sviluppo]] di un [[kernel]] sono invitate a non usare [[algoritmo ricorsivo|algoritmi ricorsivi]] e [[buffer]] molto grandi nello stack<ref name="apple1">{{citeCita web
| publishereditore= [[Apple Inc]].
| titletitolo = Kernel Programming Guide: Performance and Stability Tips
| url=http://developer.apple.com/DOCUMENTATION/Darwin/Conceptual/KernelProgramming/style/chapter_5_section_5.html
| date data=7 novembre 2006-11-07 }} </ref><ref name="xenotime">{{citeCita web
| lastcognome = Dunlap
| firstnome = Randy
| titletitolo = Linux Kernel Development: Getting Started
| url=http://www.xenotime.net/linux/mentor/linux-mentoring.pdf
| date data=19 maggio 2005-05-19 }} </ref>.
 
==Esempi nel linguaggio [[C (linguaggio)|C]]/[[C++]]==