La falla de segmentación ( eng. Falla de segmentación , abbr. segfault , jarg . segfault) es un error de software que ocurre cuando intenta acceder a áreas de la memoria que son inaccesibles para escribir o cuando intenta cambiar la memoria de una manera prohibida. En los sistemas basados en procesadores Motorola 68000 , estos errores se conocen generalmente como errores de dirección o de bus .
En los sistemas operativos similares a UNIX , un proceso que accede a una memoria no válida recibe la señal SIGSEGV . En Microsoft Windows , un proceso que acceda a una memoria no válida generará una excepción STATUS_ACCESS_VIOLATION (definición del código 0xC0000005 [1] ) y, por lo general, solicitará la ejecución del depurador de la aplicación y le mostrará al usuario una ventana que le solicitará que presente un informe de error con Microsoft .
Aquí hay un ejemplo de código ANSI C que da como resultado una falla de segmentación debido a la presencia de un calificador de tipo const :
const char * s = "hola mundo" ; * ( caracter * ) s = 'H' ;Cuando se compila el programa que contiene este código , la línea se coloca en la sección del programa con una marca binaria de solo lectura. En el inicio, el sistema operativo lo coloca, junto con otras cadenas y constantes , en un segmento de memoria de solo lectura. Una vez ejecutada, la variable apunta a la dirección del comienzo de la cadena , y un intento de asignar el valor de una constante de carácter a través de una variable en la memoria da como resultado una falla de segmentación. "hello world" s 'H'
La compilación y ejecución de tales programas en OpenBSD 4.0 produce el siguiente error de tiempo de ejecución:
$ gcc segfault.c -g -o segfault $ ./segfault Error de segmentación Programa recibido señal SIGSEGV, Fallo de segmentación. 0x1c0005c2 en main() en segfault.c:6 6 *s = 'H';Por el contrario, GCC 4.1.1 en GNU/Linux devuelve un error en tiempo de compilación :
$ gcc segfault.c -g -o segfault segfault.c: En la función 'main': segfault.c:4: error: asignación de ubicación de solo lecturaLas condiciones bajo las cuales ocurren las violaciones de segmentación y cómo se manifiestan dependen del sistema operativo .
Este ejemplo de código crea un puntero nulo e intenta asignar un valor a una dirección inexistente. Esto provoca fallas de segmentación durante la ejecución del programa en muchos sistemas .
int * ptr = ( int * ) 0 ; * punto = 1 ;Otra forma de causar una falla de segmentación es llamar a la función main() recursivamente , lo que resultará en un desbordamiento de pila :
int principal () { principal (); }Por lo general, una falla de segmentación ocurre porque:
Por ejemplo,
char * p1 = NULL ; /* inicializado a nulo; esto está permitido, pero en muchos sistemas no se puede desreferenciar */ char * p2 ; /* no inicializado en absoluto (apunta a una dirección arbitraria en la memoria) */ carácter * p3 = ( carácter * ) malloc ( 20 ); /* OK, memoria asignada */ libre ( p3 ); /* pero ahora se ha ido */Ahora, desreferenciar cualquiera de estos punteros puede causar una falla de segmentación.
O cuando usa arreglos , si accidentalmente especifica una variable no inicializada como el tamaño de un arreglo :
int principal () { const int nmax = 10 ; int i , n , a [ n ]; }El compilador G++ no rastrea este error de vinculación , lo que puede causar una falla de segmentación cuando se ejecuta el programa compilado .
de los sistemas operativos | Aspectos|||||
---|---|---|---|---|---|
| |||||
Tipos |
| ||||
Núcleo |
| ||||
Gestión de procesos |
| ||||
Gestión y direccionamiento de memoria | |||||
Herramientas de carga e inicialización | |||||
caparazón | |||||
Otro | |||||
Categoría Wikimedia Commons Wikilibros Wikcionario |