.. SPDX-License-Identifier: GPL-2.0 .. include:: ../disclaimer-zh_CN.rst :Original: Documentation/dev-tools/ubsan.rst :Translator: Dongliang Mu <dzm91@hust.edu.cn> 未定义行为消毒剂 - UBSAN ==================================== UBSAN是一ç§åŠ¨æ€æœªå®šä¹‰è¡Œä¸ºæ£€æŸ¥å·¥å…·ã€‚ UBSANä½¿ç”¨ç¼–è¯‘æ—¶æ’æ¡©æ•æ‰æœªå®šä¹‰è¡Œä¸ºã€‚编译器在å¯èƒ½å¯¼è‡´æœªå®šä¹‰è¡Œä¸ºçš„æ“ä½œå‰æ’入特定 检测代ç ã€‚å¦‚æžœæ£€æŸ¥å¤±è´¥ï¼Œå³æ£€æµ‹åˆ°æœªå®šä¹‰è¡Œä¸ºï¼Œ__ubsan_handle_* å‡½æ•°å°†è¢«è°ƒç”¨æ‰“å° é”™è¯¯ä¿¡æ¯ã€‚ GCC自4.9.x [1_] ï¼ˆè¯¦è§ ``-fsanitize=undefined`` 选项åŠå…¶å选项)版本åŽå¼•入这 一特性。GCC 5.x 版本实现了更多检查器 [2_]。 æŠ¥å‘Šæ ·ä¾‹ -------------- :: ================================================================================ UBSAN: Undefined behaviour in ../include/linux/bitops.h:110:33 shift exponent 32 is to large for 32-bit type 'unsigned int' CPU: 0 PID: 0 Comm: swapper Not tainted 4.4.0-rc1+ #26 0000000000000000 ffffffff82403cc8 ffffffff815e6cd6 0000000000000001 ffffffff82403cf8 ffffffff82403ce0 ffffffff8163a5ed 0000000000000020 ffffffff82403d78 ffffffff8163ac2b ffffffff815f0001 0000000000000002 Call Trace: [<ffffffff815e6cd6>] dump_stack+0x45/0x5f [<ffffffff8163a5ed>] ubsan_epilogue+0xd/0x40 [<ffffffff8163ac2b>] __ubsan_handle_shift_out_of_bounds+0xeb/0x130 [<ffffffff815f0001>] ? radix_tree_gang_lookup_slot+0x51/0x150 [<ffffffff8173c586>] _mix_pool_bytes+0x1e6/0x480 [<ffffffff83105653>] ? dmi_walk_early+0x48/0x5c [<ffffffff8173c881>] add_device_randomness+0x61/0x130 [<ffffffff83105b35>] ? dmi_save_one_device+0xaa/0xaa [<ffffffff83105653>] dmi_walk_early+0x48/0x5c [<ffffffff831066ae>] dmi_scan_machine+0x278/0x4b4 [<ffffffff8111d58a>] ? vprintk_default+0x1a/0x20 [<ffffffff830ad120>] ? early_idt_handler_array+0x120/0x120 [<ffffffff830b2240>] setup_arch+0x405/0xc2c [<ffffffff830ad120>] ? early_idt_handler_array+0x120/0x120 [<ffffffff830ae053>] start_kernel+0x83/0x49a [<ffffffff830ad120>] ? early_idt_handler_array+0x120/0x120 [<ffffffff830ad386>] x86_64_start_reservations+0x2a/0x2c [<ffffffff830ad4f3>] x86_64_start_kernel+0x16b/0x17a ================================================================================ 用法 ----- ä½¿ç”¨å¦‚ä¸‹å†…æ ¸é…ç½®å¯ç”¨UBSAN:: CONFIG_UBSAN=y ä½¿ç”¨å¦‚ä¸‹å†…æ ¸é…ç½®æ£€æŸ¥æ•´ä¸ªå†…æ ¸:: CONFIG_UBSAN_SANITIZE_ALL=y 为了在特定文件或目录å¯åŠ¨ä»£ç æ’桩,需è¦åœ¨ç›¸åº”çš„å†…æ ¸Makefile䏿·»åŠ ä¸€è¡Œç±»ä¼¼å†…å®¹: - 啿–‡ä»¶ï¼ˆå¦‚main.o):: UBSAN_SANITIZE_main.o := y - 一个目录ä¸çš„æ‰€æœ‰æ–‡ä»¶:: UBSAN_SANITIZE := y å³ä½¿è®¾ç½®äº†``CONFIG_UBSAN_SANITIZE_ALL=y``,为了é¿å…æ–‡ä»¶è¢«æ’æ¡©ï¼Œå¯ä½¿ç”¨:: UBSAN_SANITIZE_main.o := n 与:: UBSAN_SANITIZE := n 未对é½çš„内å˜è®¿é—®æ£€æµ‹å¯é€šè¿‡å¼€å¯ç‹¬ç«‹é€‰é¡¹ - CONFIG_UBSAN_ALIGNMENT 检测。 è¯¥é€‰é¡¹åœ¨æ”¯æŒæœªå¯¹é½è®¿é—®çš„æž¶æž„上(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y) 默认为关é—。该选项ä»å¯é€šè¿‡å†…æ ¸é…ç½®å¯ç”¨ï¼Œä½†å®ƒå°†äº§ç”Ÿå¤§é‡çš„UBSAN报告。 å‚考文献 ---------- .. _1: https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Debugging-Options.html .. _2: https://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html .. _3: https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html