Che cos'è uno stack overflow?
Lo overflow dello stack è un errore di programmazione in cui un tentativo di scrivere dati su un determinato blocco di memoria fallisce perché non c'è spazio nel blocco. Questo tipo di errore si verifica allo stesso modo degli overflow del buffer, degli overflow dell'heap e degli overflow del buffer dello stack. La differenza tra questi tipi di errori dipende dalla struttura dei dati del computer utilizzata e la caratteristica comune è che si verifica un tentativo di scrivere più dati di quanti siano gli spazi disponibili per conservarli.
I sintomi di un overflow dello stack possono variare in base al linguaggio del computer utilizzato e al meccanismo di segnalazione degli errori disponibile. In C ++, un overflow dello stack si manifesta spesso come un errore di segmentazione e spesso non vengono fornite informazioni aggiuntive per determinare dove o come si è verificato l'overflow. Un overflow in Java provoca spesso un arresto anomalo della macchina virtuale che genera un file di errore ragionevolmente dettagliato. Indipendentemente dalla lingua in cui si verifica un overflow, l'overflow può quasi sempre essere corretto mediante il debug e l'identificazione corretti della sorgente di overflow originale.
I linguaggi per computer che offrono una gestione esplicita della memoria sono spesso più facili da proteggere dallo overflow dello stack. La pratica di programmazione ampiamente accettata di solito impone che per ogni segmento di memoria allocato da un programma, anche il programma dovrebbe cancellarsi. C ++ consente questo meccanismo e un attento monitoraggio in questo modo può ridurre al minimo la quantità di memoria utilizzata da un programma. Le lingue che non offrono una gestione esplicita della memoria e che utilizzano invece la gestione implicita della memoria sono più difficili da proteggere dagli errori di overflow dello stack. Java gestisce la propria memoria all'interno della sua macchina virtuale, quindi i dati non possono essere esplicitamente eliminati a piacimento per fare spazio ad altro.
Un errore comune dei programmatori alle prime armi è quello di supporre che un overflow dello stack non possa verificarsi in linguaggi informatici che gestiscono la propria gestione della memoria. Anche se all'inizio sembra plausibile, in realtà non è così. Le lingue con la gestione implicita della memoria hanno spesso garbage collector che liberano blocchi inutili di memoria, ma questi garbage collector non funzionano sempre nel modo previsto dal programmatore. Fare affidamento sui garbage collector è relativamente pericoloso e non può sempre proteggere un programma da un errore di overflow.
Gli errori di overflow possono essere catastrofici e arrestare un intero programma, oppure possono essere quasi silenziosi e consentire a un programma di continuare. Questi secondi tipi di errori sono spesso i più difficili da trovare perché potrebbe verificarsi un errore derivante da un overflow di molte righe di codice prima. Un overflow dello stack spesso non richiede la ricerca in un intero programma, ma più a lungo un programma può essere eseguito dopo un overflow, più difficile potrebbe essere l'errore di trovare e correggere.