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.
This commit is contained in:
James Ring 2026-04-01 18:27:00 -07:00
parent f0aa4e8643
commit 57f4c6866d

View File

@ -6,6 +6,8 @@
#ifndef _WASM_COMMON_H
#define _WASM_COMMON_H
#include <string.h>
#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