Mark wasm_rt_trap as noreturn

This commit is contained in:
刘皓 2025-02-16 01:26:16 -05:00
parent f355a6585e
commit 5e93e5e834
No known key found for this signature in database
GPG key ID: 7901753DB465B711
2 changed files with 23 additions and 11 deletions

View file

@ -24,43 +24,49 @@
#include "core.h"
#include "wasm-rt.h"
#define WASM_PAGE_SIZE 65536U
#define WASM_PAGE_SIZE ((uint64_t)65536U)
#define WASM_MIN_PAGES 1024U // tentative
#define WASM_MIN_PAGES ((uint32_t)1024U) // tentative
extern "C" bool wasm_rt_is_initialized(void) {
return true;
}
extern "C" void wasm_rt_trap(wasm_rt_trap_t error) {
extern "C" WASM_RT_NO_RETURN void wasm_rt_trap(wasm_rt_trap_t error) {
mkxp_retro::log_printf(RETRO_LOG_ERROR, "Sandbox error %d\n", error);
std::abort();
}
extern "C" void wasm_rt_allocate_memory(wasm_rt_memory_t *memory, uint32_t initial_pages, uint32_t max_pages, bool is64) {
memory->data = (uint8_t *)std::malloc(std::max(initial_pages, WASM_MIN_PAGES) * WASM_PAGE_SIZE);
if ((memory->size = (uint64_t)initial_pages * WASM_PAGE_SIZE) > SIZE_MAX) {
throw std::bad_alloc();
}
memory->data = (uint8_t *)std::malloc(std::max((size_t)memory->size, (size_t)WASM_MIN_PAGES));
if (memory->data == NULL) {
throw std::bad_alloc();
}
memory->pages = initial_pages;
memory->size = initial_pages * WASM_PAGE_SIZE;
}
extern "C" uint32_t wasm_rt_grow_memory(wasm_rt_memory_t *memory, uint32_t pages) {
uint32_t new_pages;
if (__builtin_add_overflow(memory->pages, pages, &new_pages)) {
uint32_t new_pages = memory->pages + pages;
if (new_pages < memory->pages) { // Unsigned integer overflow
return -1;
}
uint8_t *new_data = new_pages <= WASM_MIN_PAGES ? memory->data : (uint8_t *)std::realloc(memory->data, new_pages * WASM_PAGE_SIZE);
uint64_t new_size = (uint64_t)new_pages * WASM_PAGE_SIZE;
if (new_size > SIZE_MAX) {
return -1;
}
uint8_t *new_data = new_pages <= WASM_MIN_PAGES ? memory->data : (uint8_t *)std::realloc(memory->data, (size_t)new_size);
if (new_data == NULL) {
return -1;
}
#ifdef MKXPZ_BIG_ENDIAN
std::memmove(new_data + pages * WASM_PAGE_SIZE, new_data, memory->size);
std::memmove(new_data + (size_t)pages * WASM_PAGE_SIZE, new_data, (size_t)memory->size);
#endif // MKXPZ_BIG_ENDIAN
uint32_t old_pages = memory->pages;
memory->pages = new_pages;
memory->size = new_pages * WASM_PAGE_SIZE;
memory->size = new_size;
memory->data = new_data;
return old_pages;
}

View file

@ -58,6 +58,12 @@ extern "C" {
# define wasm_rt_memcpy memcpy
#endif
#ifdef _MSC_VER
# define WASM_RT_NO_RETURN __declspec(noreturn)
#else
# define WASM_RT_NO_RETURN __attribute__((noreturn))
#endif
/* Don't define this as an enum. It causes builds using devkitARM or Vita SDK to successfully compile but crash on startup. */
typedef int wasm_rt_type_t;
#define WASM_RT_I32 0
@ -118,7 +124,7 @@ typedef struct {
bool wasm_rt_is_initialized(void);
void wasm_rt_trap(wasm_rt_trap_t error);
WASM_RT_NO_RETURN void wasm_rt_trap(wasm_rt_trap_t error);
void wasm_rt_allocate_memory(wasm_rt_memory_t *memory, uint32_t initial_pages, uint32_t max_pages, bool is64);