Есть миф о том, что, якобы, SIGBUS происходит только в одном случае - Invalid address alignment - и что, поскольку, физически x86 может обрабатывать такие случаи на x86 SIGBUS невозможен впринципе. Развенчаем этот миф.
glibc-2.24/sysdeps/unix/sysv/linux/x86/bits/siginfo.h знает целый ряд случаев в которых происходит SIGBUS:
BUS_ADRALN = 1, /* Invalid address alignment. */
BUS_ADRERR, /* Non-existant physical address. */
BUS_OBJERR, /* Object specific hardware error. */
BUS_MCEERR_AR, /* Hardware memory error: action required. */
BUS_MCEERR_AO /* Hardware memory error: action optional. */
Идём дальше. В ядре есть ловушки (traps) для отлова ошибок, которые, сюрприз, работают и на x86:
> grep -E "SIGBUS" linux-4.7/arch/x86/kernel/* -R
linux-4.7/arch/x86/kernel/cpu/mcheck/mce.c: * 1: panic or SIGBUS on uncorrected errors, log corrected errors
linux-4.7/arch/x86/kernel/cpu/mcheck/mce.c: * 2: SIGBUS or log uncorrected errors (if possible), log corr. errors
linux-4.7/arch/x86/kernel/cpu/mcheck/mce.c: * 3: never panic or SIGBUS, log all errors (for testing only)
linux-4.7/arch/x86/kernel/cpu/mcheck/mce.c: force_sig(SIGBUS, current);
linux-4.7/arch/x86/kernel/traps.c:DO_ERROR(X86_TRAP_NP, SIGBUS, "segment not present", segment_not_present)
linux-4.7/arch/x86/kernel/traps.c:DO_ERROR(X86_TRAP_SS, SIGBUS, "stack segment", stack_segment)
linux-4.7/arch/x86/kernel/traps.c:DO_ERROR(X86_TRAP_AC, SIGBUS, "alignment check", alignment_check)