¿Qué significa el mensaje "error de bus" y en qué se diferencia de un segfault?
c
unix
segmentation-fault
bus-error
raldi
fuente
fuente
Respuestas:
Los errores de bus son raros hoy en día en x86 y ocurren cuando su procesador ni siquiera puede intentar el acceso de memoria solicitado, típicamente:
Las fallas de segmentación ocurren cuando se accede a la memoria que no pertenece a su proceso, son muy comunes y generalmente son el resultado de:
PD: Para ser más precisos, esto no es manipular el puntero en sí mismo que causará problemas, es acceder a la memoria a la que apunta (desreferenciar).
fuente
/var/cache
era simplemente askubuntu.com/a/915520/493379static_cast
editó unvoid *
parámetro a un objeto que almacena una devolución de llamada (un atributo apunta al objeto y el otro al método). Entonces se llama la devolución de llamada. Sin embargo, lo que se pasóvoid *
fue algo completamente diferente y, por lo tanto, la llamada al método causó el error del bus.Un defecto de seguridad es acceder a la memoria a la que no puede acceder. Es de solo lectura, no tienes permiso, etc.
Un error del bus está intentando acceder a la memoria que posiblemente no puede estar allí. Ha utilizado una dirección que no tiene sentido para el sistema, o el tipo de dirección incorrecto para esa operación.
fuente
mmap
Ejemplo mínimo de POSIX 7El "error de bus" ocurre cuando el núcleo envía
SIGBUS
a un proceso.Un ejemplo mínimo que lo produce porque
ftruncate
fue olvidado:Corre con:
Probado en Ubuntu 14.04.
POSIX describe
SIGBUS
como:La especificación mmap dice que:
Y
shm_open
dice que genera objetos de tamaño 0:Entonces
*map = 0
, estamos tocando más allá del final del objeto asignado.Accesos de memoria de pila no alineados en ARMv8 aarch64
Esto se mencionó en: ¿Qué es un error de bus? para SPARC, pero aquí proporcionaré un ejemplo más reproducible.
Todo lo que necesitas es un programa independiente aarch64:
Ese programa genera SIGBUS en Ubuntu 18.04 aarch64, Linux kernel 4.15.0 en una máquina de servidor ThunderX2 .
Desafortunadamente, no puedo reproducirlo en el modo de usuario QEMU v4.0.0, no estoy seguro de por qué.
La falla parece ser opcional y controlada por los campos
SCTLR_ELx.SA
ySCTLR_EL1.SA0
, he resumido los documentos relacionados un poco más aquí .fuente
De: aquí
fuente
También puede obtener SIGBUS cuando una página de códigos no puede ser paginada por alguna razón.
fuente
mmap
un archivo más grande que el tamaño de/dev/shm
Una instancia clásica de un error de bus está en ciertas arquitecturas, como el SPARC (al menos algunos SPARC, tal vez esto ha cambiado), es cuando haces un acceso mal alineado. Por ejemplo:
Este fragmento intenta escribir el valor entero de 32 bits
0xdeadf00d
en una dirección que (muy probablemente) no esté alineada correctamente, y generará un error de bus en arquitecturas que son "exigentes" a este respecto. El procesador Intel x86 es, por cierto, no este tipo de arquitectura, que permitiría el acceso (aunque se ejecute más lentamente).fuente
Un ejemplo específico de un error de bus que acabo de encontrar al programar C en OS X:
En caso de que no recuerde, los documentos
strcat
añaden el segundo argumento al primero cambiando el primer argumento (voltee los argumentos y funciona bien). En Linux, esto da un error de segmentación (como se esperaba), pero en OS X da un error de bus. ¿Por qué? Realmente no lo se.fuente
"foo"
se almacena en un segmento de memoria de solo lectura, por lo que es imposible escribir en él. No sería protección contra desbordamiento de pila, solo protección contra escritura de memoria (este es un agujero de seguridad si su programa puede reescribirse).Depende de su sistema operativo, CPU, compilador y posiblemente otros factores.
En general, significa que el bus de la CPU no pudo completar un comando o sufrió un conflicto, pero eso podría significar una gran variedad de cosas dependiendo del entorno y el código que se ejecuta.
-Adán
fuente
Normalmente significa un acceso no alineado.
Un intento de acceder a la memoria que no está físicamente presente también daría un error de bus, pero no verá esto si está utilizando un procesador con un MMU y un sistema operativo que no tiene errores, porque no tendrá -existente memoria asignada al espacio de direcciones de su proceso.
fuente
scanf
). ¿Eso significa que OS X Mavericks tiene errores? ¿Cuál habría sido el comportamiento en un sistema operativo sin errores?Estaba recibiendo un error de bus cuando el directorio raíz estaba al 100%.
fuente
Mi razón para el error del bus en Mac OS X fue que intenté asignar aproximadamente 1Mb en la pila. Esto funcionó bien en un subproceso, pero cuando se usa openMP esto conduce al error de bus, porque Mac OS X tiene un tamaño de pila muy limitado para subprocesos no principales .
fuente
Estoy de acuerdo con todas las respuestas anteriores. Aquí están mis 2 centavos con respecto al error del BUS:
No es necesario que surja un error de BUS a partir de las instrucciones dentro del código del programa. Esto puede suceder cuando está ejecutando un binario y durante la ejecución, el binario se modifica (sobrescrito por una compilación o eliminado, etc.).
Verificar si este es el caso: una forma sencilla de verificar si esta es la causa es mediante la ejecución de instancias en ejecución del mismo binario y ejecutar una compilación. Ambas instancias en ejecución se bloquearían con un
SIGBUS
error poco después de que la compilación haya finalizado y reemplazado el binario (el que ambas instancias están ejecutando actualmente)Razón subyacente: Esto se debe a que el sistema operativo intercambia páginas de memoria y, en algunos casos, el binario podría no estar completamente cargado en la memoria y estos bloqueos se producirían cuando el sistema operativo intente recuperar la siguiente página del mismo binario, pero el binario ha cambiado desde la última vez Léelo.
fuente
Para agregar a lo que blxtd respondió anteriormente, los errores del bus también ocurren cuando su proceso no puede intentar acceder a la memoria de una 'variable' particular .
Observe el uso ' inadvertido ' de la variable 'i' en el primer 'for loop'? Eso es lo que está causando el error del bus en este caso.
fuente
Me acabo de enterar por las malas que en un procesador ARMv7 puede escribir un código que le da un error de segmentación cuando no está optimizado, pero le da un error de bus cuando se compila con -O2 (optimice más).
Estoy usando el compilador cruzado GCC ARM gnueabihf de Ubuntu 64 bit.
fuente
Un desbordamiento de búfer típico que produce un error de bus es,
Aquí, si el tamaño de la cadena entre comillas dobles ("") es mayor que el tamaño de buf, da error de bus.
fuente