Stack overflow: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica |
Migliorato la pagina |
||
(15 versioni intermedie di 11 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
In molti [[linguaggi di programmazione]], lo [[Call stack|stack delle chiamate]] contiene una quantità limitata di memoria, 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 è usata troppa memoria nello
== Ricorsione infinita ==
{{Vedi anche|Loop infinito}}
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 può essere eseguita senza ''stack overflow''. Questo avviene poiché le chiamate che fanno uso di ''tail
== Variabili di stack molto grandi ==
L'altra causa principale dello ''stack overflow'' è il tentativo di allocare più memoria di quella disponibile nello stack. Questo avviene 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
== 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 eseguito come ''[[Thread (informatica)|thread]]'' singolo potrebbe funzionare correttamente, ma se lo stesso programma è eseguito con ''thread'' multipli si verifica un
Allo stesso modo, chi studia lo [[sviluppo (informatica)|
== Esempi nel
=== Ricorsione infinita con una funzione ===▼
<syntaxhighlight lang="c" line="1" copy=1>
▲===Ricorsione infinita con una funzione===
f();▼
▲ }
▲ int main(void) {
return
return 0;▼
</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 (mutuale) ===
int main(void) {
▲ }
</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]]
|