From 57f4c6866d1196833f3e0056349b7b649d0b586f Mon Sep 17 00:00:00 2001 From: James Ring Date: Wed, 1 Apr 2026 18:27:00 -0700 Subject: [PATCH] runtime_common: always use memcpy in STORE_PTR This is one of the many causes of unaligned load warnings in -fsanitize=alignment. memcpy should always be OK: on architectures where unaligned stores are OK, this will turn into a single move. This was discussed back in 2024 at https://github.com/bytecodealliance/wasm-micro-runtime/issues/2349. --- core/iwasm/common/wasm_runtime_common.h | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/core/iwasm/common/wasm_runtime_common.h b/core/iwasm/common/wasm_runtime_common.h index 0477387ed0..f053485aec 100644 --- a/core/iwasm/common/wasm_runtime_common.h +++ b/core/iwasm/common/wasm_runtime_common.h @@ -6,6 +6,8 @@ #ifndef _WASM_COMMON_H #define _WASM_COMMON_H +#include + #include "bh_platform.h" #include "bh_common.h" #include "wasm_exec_env.h" @@ -31,6 +33,12 @@ extern "C" { /* Internal use for setting default running mode */ #define Mode_Default 0 +#define STORE_PTR(addr, ptr) \ + do { \ + void *val = (ptr); \ + memcpy((addr), &val, sizeof(void *)); \ + } while (0) + #if WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS != 0 #define PUT_I64_TO_ADDR(addr, value) \ @@ -88,11 +96,6 @@ STORE_V128(void *addr, V128 value) #define LOAD_U16(addr) (*(uint16 *)(addr)) #define LOAD_V128(addr) (*(V128 *)(addr)) -#define STORE_PTR(addr, ptr) \ - do { \ - *(void **)addr = (void *)ptr; \ - } while (0) - #else /* WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS != 0 */ #define PUT_V128_TO_ADDR(addr, value) \ @@ -465,12 +468,6 @@ LOAD_I16(void *addr) #define LOAD_U32(addr) ((uint32)LOAD_I32(addr)) #define LOAD_U16(addr) ((uint16)LOAD_I16(addr)) -#if UINTPTR_MAX == UINT32_MAX -#define STORE_PTR(addr, ptr) STORE_U32(addr, (uintptr_t)ptr) -#elif UINTPTR_MAX == UINT64_MAX -#define STORE_PTR(addr, ptr) STORE_I64(addr, (uintptr_t)ptr) -#endif - #endif /* WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS != 0 */ #if WASM_ENABLE_SHARED_MEMORY != 0