Disambiguazione – "Stack Overflow" rimanda qui. Se stai cercando il sito di Q&A omonimo, vedi Stack Overflow (sito).

In informatica, uno stack overflow avviene quando è richiesto l'uso di una quantità troppo elevata di memoria nello stack.

In molti linguaggi di programmazione, lo 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 della macchina, l'uso del multithreading e la disponibilità di memoria nel sistema. Quando è usata troppa memoria nello stack si dice che avviene un overflow, e si verifica un crash del programma[1]. Questa classe di bug solitamente è causata da uno dei due tipi di errori di programmazione[2]: la ricorsione infinita e l'uso di variabili di stack molto grandi.

Ricorsione infinita

modifica
Lo stesso argomento in dettaglio: Loop infinito.

La causa più comune di uno stack overflow è una ricorsione con profondità eccessiva o infinita.

I linguaggi che implementano la tecnica 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 recursion non richiedono uno spazio aggiuntivo nello stack[3].

Variabili di stack molto grandi

modifica

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 variabili locali molto grande. Per questo motivo gli array più grandi di qualche kilobyte dovrebbero essere allocati dinamicamente anziché allocarli come variabili locali[4].

Cause che possono ridurre la dimensione dello stack disponibile e quindi rendere più probabile uno stack overflow

modifica

Gli stack overflow sono aggravati da qualsiasi cosa riduca la dimensione effettiva dello stack di un programma.

Ad esempio un programma eseguito come thread singolo potrebbe funzionare correttamente, ma se lo stesso programma è eseguito con thread multipli si verifica un crash del programma, perché molti programmi che usano i thread hanno a disposizione uno stack più piccolo per ogni singolo thread rispetto a un programma che non usa i thread.

Allo stesso modo, chi studia lo sviluppo di un kernel è invitato a non usare algoritmi ricorsivi e buffer molto grandi nello stack[5][6].

Esempi nel linguaggio C/C++

modifica

Ricorsione infinita con una funzione

modifica
void f() {
  f();
}
int main(void) {
  f();
  return 0;
}

Questo frammento di codice invoca la funzione f(), e la funzione f() a sua volta richiama se stessa, generando in tal modo una ricorsione infinita.

Ricorsione infinita con due funzioni (mutuale)

modifica
void f(void); 
void g(void);

int main(void) {
  f();

  return 0;
}
 
void f(void) {
  g();
}
 
void g(void) {
  f();  
}

La funzione f() e la funzione g() si richiamano continuamente a vicenda, finché non si verifica lo stack overflow.

Variabile nello stack eccessivamente grande

modifica
int main(void) {
  double n[10000000]; 
  return 0;
}

L'array dichiarato in questo frammento di codice richiede più memoria di quella disponibile nello stack, causando così uno stack overflow.

Note

modifica
  1. ^ James Craig Burley, Using and Porting GNU Fortran, su sunsite.ualberta.ca, 1º giugno 1991 (archiviato dall'url originale il 5 ottobre 2012).
  2. ^ Kalev Danny, Understanding Stack Overflow, su devx.com, 5 settembre 2000.
  3. ^ An Introduction to Scheme and its Implementation, su federated.com, 19 febbraio 1997 (archiviato dall'url originale il 10 agosto 2007).
  4. ^ Howard Feldman, Modern Memory Management, Part 2, su onlamp.com, 23 novembre 2005. URL consultato il 10 novembre 2009 (archiviato dall'url originale il 20 settembre 2012).
  5. ^ Kernel Programming Guide: Performance and Stability Tips, su developer.apple.com, Apple Inc., 7 novembre 2006 (archiviato dall'url originale il 7 dicembre 2008).
  6. ^ Randy Dunlap, Linux Kernel Development: Getting Started (PDF), su xenotime.net, 19 maggio 2005 (archiviato dall'url originale il 27 febbraio 2012).

Voci correlate

modifica

Collegamenti esterni

modifica
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica

📚 Artikel Terkait di Wikipedia

Stack Overflow (sito)

Stack Overflow è un sito web collaborativo che fa parte della rete Stack Exchange in cui si possono porre domande riguardo a vasti argomenti di programmazione

Visual Studio Code

Stack Overflow Developer Survey 2016 Results, in Stack Overflow. URL consultato il 15 aprile 2018. ^ Stack Overflow Developer Survey 2018, in Stack Overflow

ChatGPT

modelli LLM probabilisticamente non garantiscono la verità fattuale. Stack Overflow ha temporaneamente vietato le risposte generate da ChatGPT nel 2022

Rust (linguaggio di programmazione)

Stack Overflow Developer Survey 2016 Results, su Stack Overflow. URL consultato il 17 giugno 2016. ^ Stack Overflow Developer Survey 2017, in Stack Overflow

Buffer overflow

Se stai cercando il buffer overflow legato alle telecomunicazioni, vedi Buffer overflow (telecomunicazioni). Buffer overflow (o buffer overrun), in informatica

Overflow

sua memorizzazione Stack overflow – eccessiva allocazione di memoria, da parte di un programma, all'interno dello stack Buffer overflow – memorizzazione

Bubble sort

verificato l'ultimo scambio. ^ (EN) Newest 'bubble sort' Questions, su Stack Overflow. «Bubble sort is a simple sorting algorithm that works by repeatedly

Docker

software indipendente dal sistema operativo. ^ (EN) Stack Overflow Developer Survey 2021, su Stack Overflow. URL consultato il 4 ottobre 2024. ^ (EN) Containers