Errore di segmentazione

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 della 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.

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 
 */
}

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. Inoltre, tali condizioni possono dipendere dalla specifica sequenza di istruzioni eseguite e dalla specifica mappa della memoria utilizzata fino al momento della violazione. Di conseguenza, un errore può avvenire o non avvenire a seconda del contesto. Questo rende particolarmente difficile fare il debug di questo tipo di errore, che appare così non deterministico, ovvero contenente una componente casuale.

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 includono nella propria mappatura la prima pagina di memoria (quella che inizia all'indirizzo 0) così che essa non è più disponibile per gli utenti ed eventuali accessi ad essa causano un errore di segmentazione.

Voci correlate

[modifica | modifica wikitesto]

Collegamenti esterni

[modifica | modifica wikitesto]
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica