From 559f83100530380567ae63a42448388880ecfdd4 Mon Sep 17 00:00:00 2001 From: Huang Qi Date: Mon, 22 Aug 2022 19:35:13 +0800 Subject: [PATCH] sim: Enable ubsan in sim:kasan Signed-off-by: Huang Qi --- boards/sim/sim/sim/configs/kasan/defconfig | 1 + mm/kasan/kasan.c | 88 +++++++++++----------- 2 files changed, 46 insertions(+), 43 deletions(-) diff --git a/boards/sim/sim/sim/configs/kasan/defconfig b/boards/sim/sim/sim/configs/kasan/defconfig index caa7c74129..847f05ea73 100644 --- a/boards/sim/sim/sim/configs/kasan/defconfig +++ b/boards/sim/sim/sim/configs/kasan/defconfig @@ -27,6 +27,7 @@ CONFIG_INIT_ARGS="\"-c\", \"ostest;gcov -d;poweroff\"" CONFIG_INIT_ENTRYPOINT="nsh_main" CONFIG_LIBC_MAX_EXITFUNS=1 CONFIG_MM_KASAN=y +CONFIG_MM_UBSAN=y CONFIG_NSH_ARCHINIT=y CONFIG_NSH_BUILTIN_APPS=y CONFIG_NSH_READLINE=y diff --git a/mm/kasan/kasan.c b/mm/kasan/kasan.c index 90c324e7cd..5d5a59a571 100644 --- a/mm/kasan/kasan.c +++ b/mm/kasan/kasan.c @@ -73,10 +73,11 @@ static FAR struct kasan_region_s *g_region; * Private Functions ****************************************************************************/ -static FAR uintptr_t *kasan_mem_to_shadow(uintptr_t addr, size_t size, +static FAR uintptr_t *kasan_mem_to_shadow(FAR const void *ptr, size_t size, unsigned int *bit) { FAR struct kasan_region_s *region; + uintptr_t addr = (uintptr_t)ptr; for (region = g_region; region != NULL; region = region->next) { @@ -93,7 +94,7 @@ static FAR uintptr_t *kasan_mem_to_shadow(uintptr_t addr, size_t size, return NULL; } -static void kasan_report(uintptr_t addr, size_t size, bool is_write) +static void kasan_report(FAR const void *addr, size_t size, bool is_write) { static int recursion; @@ -107,7 +108,7 @@ static void kasan_report(uintptr_t addr, size_t size, bool is_write) --recursion; } -static bool kasan_is_poisoned(uintptr_t addr, size_t size) +static bool kasan_is_poisoned(FAR const void *addr, size_t size) { FAR uintptr_t *p; unsigned int bit; @@ -116,7 +117,8 @@ static bool kasan_is_poisoned(uintptr_t addr, size_t size) return p && ((*p >> bit) & 1); } -static void kasan_set_poison(uintptr_t addr, size_t size, bool poisoned) +static void kasan_set_poison(FAR const void *addr, size_t size, + bool poisoned) { FAR uintptr_t *p; unsigned int bit; @@ -170,12 +172,12 @@ static void kasan_set_poison(uintptr_t addr, size_t size, bool poisoned) void kasan_poison(FAR const void *addr, size_t size) { - kasan_set_poison((uintptr_t)addr, size, true); + kasan_set_poison(addr, size, true); } void kasan_unpoison(FAR const void *addr, size_t size) { - kasan_set_poison((uintptr_t)addr, size, false); + kasan_set_poison(addr, size, false); } void kasan_register(FAR void *addr, FAR size_t *size) @@ -207,7 +209,7 @@ void __sanitizer_annotate_contiguous_container(FAR const void *beg, /* Shut up compiler complaints */ } -void __asan_before_dynamic_init(FAR const char *module_name) +void __asan_before_dynamic_init(FAR const void *module_name) { /* Shut up compiler complaints */ } @@ -222,67 +224,67 @@ void __asan_handle_no_return(void) /* Shut up compiler complaints */ } -void __asan_report_load_n_noabort(uintptr_t addr, size_t size) +void __asan_report_load_n_noabort(FAR void *addr, size_t size) { kasan_report(addr, size, false); } -void __asan_report_store_n_noabort(uintptr_t addr, size_t size) +void __asan_report_store_n_noabort(FAR void *addr, size_t size) { kasan_report(addr, size, true); } -void __asan_report_load16_noabort(uintptr_t addr) +void __asan_report_load16_noabort(FAR void *addr) { __asan_report_load_n_noabort(addr, 16); } -void __asan_report_store16_noabort(uintptr_t addr) +void __asan_report_store16_noabort(FAR void *addr) { __asan_report_store_n_noabort(addr, 16); } -void __asan_report_load8_noabort(uintptr_t addr) +void __asan_report_load8_noabort(FAR void *addr) { __asan_report_load_n_noabort(addr, 8); } -void __asan_report_store8_noabort(uintptr_t addr) +void __asan_report_store8_noabort(FAR void *addr) { __asan_report_store_n_noabort(addr, 8); } -void __asan_report_load4_noabort(uintptr_t addr) +void __asan_report_load4_noabort(FAR void *addr) { __asan_report_load_n_noabort(addr, 4); } -void __asan_report_store4_noabort(uintptr_t addr) +void __asan_report_store4_noabort(FAR void *addr) { __asan_report_store_n_noabort(addr, 4); } -void __asan_report_load2_noabort(uintptr_t addr) +void __asan_report_load2_noabort(FAR void *addr) { __asan_report_load_n_noabort(addr, 2); } -void __asan_report_store2_noabort(uintptr_t addr) +void __asan_report_store2_noabort(FAR void *addr) { __asan_report_store_n_noabort(addr, 2); } -void __asan_report_load1_noabort(uintptr_t addr) +void __asan_report_load1_noabort(FAR void *addr) { __asan_report_load_n_noabort(addr, 1); } -void __asan_report_store1_noabort(uintptr_t addr) +void __asan_report_store1_noabort(FAR void *addr) { __asan_report_store_n_noabort(addr, 1); } -void __asan_loadN_noabort(uintptr_t addr, size_t size) +void __asan_loadN_noabort(FAR void *addr, size_t size) { if (kasan_is_poisoned(addr, size)) { @@ -290,7 +292,7 @@ void __asan_loadN_noabort(uintptr_t addr, size_t size) } } -void __asan_storeN_noabort(uintptr_t addr, size_t size) +void __asan_storeN_noabort(FAR void * addr, size_t size) { if (kasan_is_poisoned(addr, size)) { @@ -298,112 +300,112 @@ void __asan_storeN_noabort(uintptr_t addr, size_t size) } } -void __asan_load16_noabort(uintptr_t addr) +void __asan_load16_noabort(FAR void *addr) { __asan_loadN_noabort(addr, 16); } -void __asan_store16_noabort(uintptr_t addr) +void __asan_store16_noabort(FAR void *addr) { __asan_storeN_noabort(addr, 16); } -void __asan_load8_noabort(uintptr_t addr) +void __asan_load8_noabort(FAR void *addr) { __asan_loadN_noabort(addr, 8); } -void __asan_store8_noabort(uintptr_t addr) +void __asan_store8_noabort(FAR void *addr) { __asan_storeN_noabort(addr, 8); } -void __asan_load4_noabort(uintptr_t addr) +void __asan_load4_noabort(FAR void *addr) { __asan_loadN_noabort(addr, 4); } -void __asan_store4_noabort(uintptr_t addr) +void __asan_store4_noabort(FAR void *addr) { __asan_storeN_noabort(addr, 4); } -void __asan_load2_noabort(uintptr_t addr) +void __asan_load2_noabort(FAR void *addr) { __asan_loadN_noabort(addr, 2); } -void __asan_store2_noabort(uintptr_t addr) +void __asan_store2_noabort(FAR void *addr) { __asan_storeN_noabort(addr, 2); } -void __asan_load1_noabort(uintptr_t addr) +void __asan_load1_noabort(FAR void *addr) { __asan_loadN_noabort(addr, 1); } -void __asan_store1_noabort(uintptr_t addr) +void __asan_store1_noabort(FAR void *addr) { __asan_storeN_noabort(addr, 1); } -void __asan_loadN(uintptr_t addr, size_t size) +void __asan_loadN(FAR void *addr, size_t size) { __asan_loadN_noabort(addr, size); } -void __asan_storeN(uintptr_t addr, size_t size) +void __asan_storeN(FAR void *addr, size_t size) { __asan_storeN_noabort(addr, size); } -void __asan_load16(uintptr_t addr) +void __asan_load16(FAR void *addr) { __asan_load16_noabort(addr); } -void __asan_store16(uintptr_t addr) +void __asan_store16(FAR void *addr) { __asan_store16_noabort(addr); } -void __asan_load8(uintptr_t addr) +void __asan_load8(FAR void *addr) { __asan_load8_noabort(addr); } -void __asan_store8(uintptr_t addr) +void __asan_store8(FAR void *addr) { __asan_store8_noabort(addr); } -void __asan_load4(uintptr_t addr) +void __asan_load4(FAR void *addr) { __asan_load4_noabort(addr); } -void __asan_store4(uintptr_t addr) +void __asan_store4(FAR void *addr) { __asan_store4_noabort(addr); } -void __asan_load2(uintptr_t addr) +void __asan_load2(FAR void *addr) { __asan_load2_noabort(addr); } -void __asan_store2(uintptr_t addr) +void __asan_store2(FAR void *addr) { __asan_store2_noabort(addr); } -void __asan_load1(uintptr_t addr) +void __asan_load1(FAR void *addr) { __asan_load1_noabort(addr); } -void __asan_store1(uintptr_t addr) +void __asan_store1(FAR void *addr) { __asan_store1_noabort(addr); }