2010-04-21 5 views
23

Ad esempio, quando chiamiamo dire, una funzione ricorsiva, le chiamate successive vengono memorizzate nello stack. Tuttavia, a causa di un errore se continua all'infinito, l'errore è 'Segmentation fault' (come visto su GCC).Qual è la differenza tra un errore di segmentazione e uno stack overflow?

Non dovrebbe essere stato "stack-overflow"? Qual è allora la differenza fondamentale tra i due?

Btw, una spiegazione sarebbe più utile dei collegamenti di Wikipedia (passati attraverso questo, ma nessuna risposta a una query specifica).

+4

Lo straripamento riguarda le domande di programmazione, le informazioni sui guasti riguardano i server. oO –

+2

@Pavel: cosa ha a che fare SIGSEGV con i server? Sebbene le applicazioni server possano causare un errore di segmentazione, ciò non ha davvero nulla a che fare con l'amministrazione del server e tutto ciò che riguarda la programmazione. –

+5

@George: http://serverfault.com/ e whoosh. – kennytm

risposta

51

L'overflow dello stack è [a] causa, il difetto di segmentazione è il risultato.


Almeno su x86 e ARM, il "stack" è un pezzo di memoria riservata per l'immissione variabili locali e gli indirizzi di ritorno di chiamate di funzione. Quando lo stack è esaurito, sarà possibile accedere alla memoria al di fuori dell'area riservata. Ma l'app non ha chiesto al kernel questa memoria, quindi verrà generato un SegFault per la protezione della memoria.

3

Lo stack di chiamate è in overflow, tuttavia il risultato dello straripamento è che alla fine i valori relativi alle chiamate vengono trasferiti in memoria che non fa parte dello stack e quindi - SIGSEGV!

3

I moderni processori utilizzano i gestori di memoria per proteggere i processi gli uni dagli altri. Il gestore della memoria x86 ha molte funzioni legacy, una delle quali è la segmentazione. La segmentazione è intesa a impedire ai programmi di manipolare la memoria in determinati modi. Ad esempio, un segmento potrebbe essere contrassegnato come di sola lettura e il codice verrà inserito lì, mentre un altro segmento è in lettura/scrittura ed è qui che vanno i tuoi dati.

Durante un overflow dello stack, si esaurisce tutto lo spazio allocato a uno dei segmenti, quindi il programma inizia a scrivere in segmenti che il gestore della memoria non consente e quindi si verifica un errore di segmentazione.

+1

Piuttosto sicuro che Unix ha usato questo termine da molto prima che arrivasse da qualche parte vicino a x86 ... – SamB

+2

@SamB Non vedo dove la risposta rivendichi altrimenti. "Il gestore della memoria x86 ha molte funzioni legacy, una delle quali è la segmentazione"! = "La segmentazione inventata x86". – JBentley

+2

La segmentazione utilizzata da x86 (i registri dei segmenti) è completamente diversa da "Segmentazione" dello spazio degli indirizzi eseguita dal sistema operativo. Segmentation Fault non ha nulla a che fare con i registri dei segmenti. Inoltre, anche se fa parte di x86 per molto tempo, i registri di segmento sono ancora molto importanti per il funzionamento di x86 nei sistemi operativi moderni. – SoapBox

2

Un overflow dello stack può manifestarsi come un'eccezione di overflow dello stack esplicito (a seconda del compilatore e dell'architettura) o come un errore di segmentazione, ad esempio l'accesso non valido alla memoria. In definitiva, l'overflow dello stack è il risultato dell'esaurimento dello spazio di stack e un possibile risultato di esaurimento dello spazio di stack è la lettura o la scrittura in memoria a cui non si deve accedere. Quindi, su molte architetture, il risultato di uno stack overflow è un errore di accesso alla memoria.