ubsan.rst 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. .. SPDX-License-Identifier: GPL-2.0
  2. Undefined Behavior Sanitizer - UBSAN
  3. ====================================
  4. UBSAN is a runtime undefined behaviour checker.
  5. UBSAN uses compile-time instrumentation to catch undefined behavior (UB).
  6. Compiler inserts code that perform certain kinds of checks before operations
  7. that may cause UB. If check fails (i.e. UB detected) __ubsan_handle_*
  8. function called to print error message.
  9. GCC has that feature since 4.9.x [1_] (see ``-fsanitize=undefined`` option and
  10. its suboptions). GCC 5.x has more checkers implemented [2_].
  11. Report example
  12. --------------
  13. ::
  14. ================================================================================
  15. UBSAN: Undefined behaviour in ../include/linux/bitops.h:110:33
  16. shift exponent 32 is to large for 32-bit type 'unsigned int'
  17. CPU: 0 PID: 0 Comm: swapper Not tainted 4.4.0-rc1+ #26
  18. 0000000000000000 ffffffff82403cc8 ffffffff815e6cd6 0000000000000001
  19. ffffffff82403cf8 ffffffff82403ce0 ffffffff8163a5ed 0000000000000020
  20. ffffffff82403d78 ffffffff8163ac2b ffffffff815f0001 0000000000000002
  21. Call Trace:
  22. [<ffffffff815e6cd6>] dump_stack+0x45/0x5f
  23. [<ffffffff8163a5ed>] ubsan_epilogue+0xd/0x40
  24. [<ffffffff8163ac2b>] __ubsan_handle_shift_out_of_bounds+0xeb/0x130
  25. [<ffffffff815f0001>] ? radix_tree_gang_lookup_slot+0x51/0x150
  26. [<ffffffff8173c586>] _mix_pool_bytes+0x1e6/0x480
  27. [<ffffffff83105653>] ? dmi_walk_early+0x48/0x5c
  28. [<ffffffff8173c881>] add_device_randomness+0x61/0x130
  29. [<ffffffff83105b35>] ? dmi_save_one_device+0xaa/0xaa
  30. [<ffffffff83105653>] dmi_walk_early+0x48/0x5c
  31. [<ffffffff831066ae>] dmi_scan_machine+0x278/0x4b4
  32. [<ffffffff8111d58a>] ? vprintk_default+0x1a/0x20
  33. [<ffffffff830ad120>] ? early_idt_handler_array+0x120/0x120
  34. [<ffffffff830b2240>] setup_arch+0x405/0xc2c
  35. [<ffffffff830ad120>] ? early_idt_handler_array+0x120/0x120
  36. [<ffffffff830ae053>] start_kernel+0x83/0x49a
  37. [<ffffffff830ad120>] ? early_idt_handler_array+0x120/0x120
  38. [<ffffffff830ad386>] x86_64_start_reservations+0x2a/0x2c
  39. [<ffffffff830ad4f3>] x86_64_start_kernel+0x16b/0x17a
  40. ================================================================================
  41. Usage
  42. -----
  43. To enable UBSAN, configure the kernel with::
  44. CONFIG_UBSAN=y
  45. To exclude files from being instrumented use::
  46. UBSAN_SANITIZE_main.o := n
  47. and to exclude all targets in one directory use::
  48. UBSAN_SANITIZE := n
  49. When disabled for all targets, specific files can be enabled using::
  50. UBSAN_SANITIZE_main.o := y
  51. Detection of unaligned accesses controlled through the separate option -
  52. CONFIG_UBSAN_ALIGNMENT. It's off by default on architectures that support
  53. unaligned accesses (CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y). One could
  54. still enable it in config, just note that it will produce a lot of UBSAN
  55. reports.
  56. References
  57. ----------
  58. .. _1: https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Debugging-Options.html
  59. .. _2: https://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html
  60. .. _3: https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html