Stack overflow: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica |
Migliorato la pagina |
||
(42 versioni intermedie di 27 utenti non mostrate) | |||
Riga 1:
{{nota disambigua|il sito di Q&A omonimo|Stack Overflow (sito)|Stack Overflow}}
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'']].
In molti [[linguaggi di programmazione]], lo [[Call stack|stack delle chiamate]] contiene una quantità limitata di memoria,
== Ricorsione infinita ==
{{Vedi anche|Loop infinito}}
La causa più comune di uno stack overflow è
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
== Variabili di stack molto grandi ==
L'altra causa principale dello ''stack overflow'' è il tentativo di allocare più memoria
== Cause che possono ridurre la dimensione dello stack disponibile e quindi rendere più probabile uno ''stack overflow'' ==
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]] 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 di un [[kernel]] sono invitate a non usare algoritmi ricorsivi e [[buffer]] molto grandi nello stack<ref name="apple1">{{cite web▼
Gli ''stack overflow'' sono aggravati da qualsiasi cosa riduca la dimensione effettiva dello ''stack'' di un programma.
▲
==Esempi nel linguaggio C/C++==▼
Allo stesso modo, chi studia lo [[sviluppo (informatica)|sviluppo]] di un [[kernel]] è invitato 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|url=https://developer.apple.com/DOCUMENTATION/Darwin/Conceptual/KernelProgramming/style/chapter_5_section_5.html|data=7 novembre 2006|urlmorto=sì|urlarchivio=https://web.archive.org/web/20081207013401/http://developer.apple.com/DOCUMENTATION/Darwin/Conceptual/KernelProgramming/style/chapter_5_section_5.html|dataarchivio=7 dicembre 2008}}</ref><ref name="xenotime">{{Cita web|cognome=Dunlap|nome=Randy|titolo=Linux Kernel Development: Getting Started|url=http://www.xenotime.net/linux/mentor/linux-mentoring.pdf|data=19 maggio 2005|urlmorto=sì|urlarchivio=https://web.archive.org/web/20120227142532/http://www.xenotime.net/linux/mentor/linux-mentoring.pdf|dataarchivio=27 febbraio 2012}}</ref>.
===Ricorsione infinita con una funzione===▼
void f() {▼
f();▼
}▼
int main(void) {▼
f();▼
return 0;▼
}▼
▲== Esempi nel linguaggio C/C++ ==
Questo frammento di codice invoca la funzione <code>f()</code>, e la funzione <code>f()</code> a sua volta richiama se stessa, generando in tal modo una ricorsione infinita.▼
▲=== Ricorsione infinita con una funzione ===
<syntaxhighlight lang="c" line="1" copy=1>
</syntaxhighlight>
▲Questo frammento di codice invoca la [[funzione (informatica)|funzione]] <code>f()</code>, e la funzione <code>f()</code> a sua volta richiama se stessa, generando in tal modo una ricorsione infinita.
===Ricorsione infinita con due funzioni===▼
▲=== Ricorsione infinita con due funzioni (mutuale) ===
void f(void); ▼
<syntaxhighlight lang="c" line="1" copy=1>
void g(void);▼
▲ return 0;
▲ }
</syntaxhighlight>
▲ void g(void) {
▲ f();
▲ }
La funzione <code>f()</code> e la funzione <code>g()</code> si richiamano continuamente a vicenda, finché non si verifica lo ''stack overflow''.
=== Variabile nello stack eccessivamente grande ===
</syntaxhighlight>
L'array dichiarato in questo frammento di codice richiede più memoria di quella disponibile nello ''stack'', causando così uno ''stack overflow''.
== Note ==
<references />
== Voci correlate ==
* [[Heap overflow]]
* [[Buffer overflow]]
== Collegamenti esterni ==
* {{FOLDOC||stack overflow}}
{{Portale|informatica}}
[[Categoria:Gestione del software]]
|