diff --git a/include/mimalloc.h b/include/mimalloc.h index bc817f54..4611dac0 100644 --- a/include/mimalloc.h +++ b/include/mimalloc.h @@ -230,6 +230,7 @@ mi_decl_export bool mi_heap_visit_blocks(const mi_heap_t* heap, bool visit_all_b mi_decl_export bool mi_is_in_heap_region(const void* p) mi_attr_noexcept; mi_decl_export int mi_reserve_huge_os_pages(size_t pages, double max_secs, size_t* pages_reserved) mi_attr_noexcept; mi_decl_export bool mi_is_redirected() mi_attr_noexcept; +mi_decl_export void mi_mem_clear(void *p, size_t); // ------------------------------------------------------ // Convenience diff --git a/src/memory.c b/src/memory.c index dd03cf95..b5f81268 100644 --- a/src/memory.c +++ b/src/memory.c @@ -130,6 +130,17 @@ bool mi_is_in_heap_region(const void* p) mi_attr_noexcept { return false; } +// In secure mode, volatile function pointer is used +// to discard eventual compiler optimization +void mi_mem_clear(void *p, size_t len) { + if (MI_SECURE>=1) { + void *(*volatile mem_clear)(void *, int, size_t) = memset; + (void)mem_clear(p, 0, len); + } else { + (void)memset(p, 0, len); + } +} + /* ---------------------------------------------------------------------------- Commit from a region diff --git a/test/test-stress.c b/test/test-stress.c index b6ceaa0a..ef4b8d7e 100644 --- a/test/test-stress.c +++ b/test/test-stress.c @@ -248,7 +248,7 @@ static void* thread_entry(void* param) { static void run_os_threads(size_t nthreads) { pthread_t* threads = (pthread_t*)custom_malloc(nthreads*sizeof(pthread_t)); - memset(threads, 0, sizeof(pthread_t)*nthreads); + mi_mem_clear(threads, sizeof(pthread_t)*nthreads); //pthread_setconcurrency(nthreads); for (uintptr_t i = 0; i < nthreads; i++) { pthread_create(&threads[i], NULL, &thread_entry, (void*)i);