Falla de Segmentación (SIGSEGV) vs Error de Bus (SIGBUS)

La falla de segmentación (SIGSEGV) y el error de bus (SIGBUS) son señales generadas cuando el sistema operativo detecta un error grave del programa y no hay forma de que el programa pueda continuar ejecutándose debido a estos errores.
1) La falla de segmentación  (también conocida como SIGSEGV y generalmente es la señal 11) ocurre cuando el programa intenta escribir/leer fuera de la memoria asignada para él o cuando escribe en la memoria que solo se puede leer. En otras palabras, cuando el programa intenta acceder a la memoria a la que no tiene acceso. SIGSEGV es la abreviatura de «Violación de segmentación». 
Algunos casos en los que se genera la señal SIGSEGV son los siguientes: 
-> Usar un puntero no inicializado 
-> Quitar la referencia de un puntero NULL 
-> Intentar acceder a la memoria que el programa no posee (por ejemplo, intentar acceder a un elemento 
de array fuera de los límites de la array). 
-> Intentar acceder a la memoria que ya está desasignada (intentar usar punteros colgantes). 
Consulte este artículo para ver ejemplos.
2) El error de bus  (también conocido como SIGBUS y generalmente es la señal 10) ocurre cuando un proceso está tratando de acceder a la memoria que la CPU no puede abordar físicamente. En otras palabras, la memoria a la que intenta acceder el programa no es una dirección de memoria válida. causado debido a problemas de alineación con la CPU (por ejemplo, tratando de leer un largo de una dirección que no es un múltiplo de 4). SIGBUS es la abreviatura de «Error de bus».
La señal SIGBUS se produce en los siguientes casos, 
-> El programa le indica a la CPU que lea o escriba una dirección de memoria física específica que no es válida / La dirección física solicitada no es reconocida por todo el sistema informático. 
-> Acceso no alineado a la memoria (por ejemplo, si los accesos multibyte deben estar alineados en 16 bits, las direcciones (dadas en bytes) en 0, 2, 4, 6, etc. se considerarán alineadas y, por lo tanto, accesibles, mientras que las direcciones 1, 3, 5, etc. se considerarían no alineados).
La principal diferencia entre la falla de segmentación y el error de bus es que la falla de segmentación indica un acceso no válido a una memoria válida, mientras que el error de bus indica un acceso a una dirección no válida. 
A continuación se muestra un ejemplo de error de bus tomado de wikipedia .
 

C

// C program to demonstrate Bus Error
#include <stdlib.h>
 
int main(int argc, char **argv)
{
    
#if defined(__GNUC__)
# if defined(__i386__)
    /* Enable Alignment Checking on x86 */
    __asm__("pushf\norl $0x40000,(%esp)\npopf");
# elif defined(__x86_64__)
     /* Enable Alignment Checking on x86_64 */
    __asm__("pushf\norl $0x40000,(%rsp)\npopf");
# endif
#endif
 
    /* malloc() always provides aligned memory */
    char *cptr = malloc(sizeof(int) + 1);
     
    /* Increment the pointer by one, making it
       misaligned */
    int *iptr = (int *) ++cptr;
 
    /* Dereference it as an int pointer, causing
       an unaligned access */
    *iptr = 42;
 
    /* Following accesses will also result in
       sigbus error.
       short *sptr;
       int    i;
 
       sptr = (short *)&i;
 
       // For all odd value increments, it will
       // result in sigbus.
       sptr = (short *)(((char *)sptr) + 1);
       *sptr = 100;    */
 
    return 0;
}

Producción : 

Bad memory access (SIGBUS) 

Este artículo es una contribución de Prashanth Pangera . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *