Stack overflow: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m Bot: Aggiungo: ko:스택 버퍼 오버플로우 |
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"> {{
|
|
|
| url= http://sunsite.ualberta.ca/Documentation/Gnu/gcc-2.95.2/html_node/g77_597.html
|
{{
|
|
|
| url=http://www.devx.com/tips/Tip/14276
|
==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">{{
|
| url=http://www.federated.com/~jim/schintro-v14/schintro_73.html
|
.
==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">{{
|
|
|
| url=http://www.onlamp.com/pub/a/onlamp/2005/11/23/memory-management-2.html
|
== 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">{{
|
|
| url=http://developer.apple.com/DOCUMENTATION/Darwin/Conceptual/KernelProgramming/style/chapter_5_section_5.html
|
|
|
|
| url=http://www.xenotime.net/linux/mentor/linux-mentoring.pdf
|
==Esempi nel linguaggio [[C (linguaggio)|C]]/[[C++]]==
|