Errore di segmentazione

Da Wikipedia, l'enciclopedia libera.

Un errore di segmentazione (in inglese segmentation fault, spesso abbreviato in segfault) è una particolare condizione di errore che può verificarsi durante l'esecuzione di un programma per computer. Un errore di segmentazione ha luogo quando un programma tenta di accedere ad una posizione di memoria alla quale non gli è permesso accedere, oppure quando tenta di accedervi in una maniera che non gli è concessa (ad esempio, scrivere su una posizione di sola lettura, oppure sovrascrivere parte del sistema operativo). I sistemi basati su processori come il Motorola 68000 fanno riferimento a questi errori come errori di memoria o di bus.

La segmentazione è un approccio alla gestione della memoria e alla sua protezione in un sistema operativo. Essa è stata superata dal paging per molti scopi, ma gran parte della terminologia della segmentazione è ancora utilizzata, primo tra tutti lo stesso termine "errore di segmentazione". Alcuni sistemi operativi utilizzano ancora la segmentazione a qualche livello logico, nonostante il paging sia la principale politica di gestione delle memoria.

Sui sistemi operativi Unix-like, un processo che fa accesso ad una posizione non valida di memoria riceve il segnale SIGSEGV. Su Microsoft Windows, un processo che fa accesso ad una posizione non valida di memoria riceve l'eccezione STATUS_ACCESS_VIOLATION.

Esempio[modifica | modifica sorgente]

Questo è l'esempio di programma ANSI C che dovrebbe generare un errore di segmentazione su piattaforme con protezione della memoria:

int main(void)
{
    char *s = "stringa"; /* s è un puntatore ad una stringa posizionata nel segmento di 
                            sola lettura dell'eseguibile.
                            Quando il programma viene caricato, questo segmento è 
                            generalmente mappato dal sistema operativo in una zona 
                            della memoria di sola lettura */

    *s = 'a';           /*  questo tenta di scrivere nella memoria di sola lettura, 
                            causando l'errore di segmentazione */
    return 0;
}

Compilando ed eseguendo il programma su OpenBSD 4.0, viene prodotto questo output:

$ gcc segfault.c -g -o segfault
$ ./segfault
Segmentation fault

Ecco il backtrace da GNU Debugger (GDB):

Program received signal SIGSEGV, Segmentation fault.
0x1c0005c2 in main () at segfault.c:6
6               *s = 'a';

Le condizioni sotto le quali avvengono le violazioni della segmentazione e come esse si manifestano sono specifiche per ogni sistema operativo.

Poiché un errore molto comune è la dereferenziazione di un puntatore nullo (leggere o scrivere attraverso un puntatore nullo, cioè un puntatore all'indirizzo 0, usato comunemente in C per indicare un "puntatore ad un oggetto nullo" oppure come indicatore d'errore), molti sistemi operativi mappano la prima pagina di memoria (quella che inizia all'indirizzo 0) così che eventuali accessi ad essa causino un errore di segmentazione.

Voci correlate[modifica | modifica sorgente]