fix asan tracking by explicitly setting memory to undefined before a free

This commit is contained in:
daanx 2024-06-03 20:28:47 -07:00
parent 3f69119936
commit 76b0873ce2
3 changed files with 7 additions and 7 deletions

View file

@ -627,6 +627,9 @@ void _mi_arena_free(void* p, size_t size, size_t committed_size, mi_memid_t memi
if (size==0) return; if (size==0) return;
const bool all_committed = (committed_size == size); const bool all_committed = (committed_size == size);
// need to set all memory to undefined as some parts may still be marked as no_access (like padding etc.)
mi_track_mem_undefined(p,size);
if (mi_memkind_is_os(memid.memkind)) { if (mi_memkind_is_os(memid.memkind)) {
// was a direct OS allocation, pass through // was a direct OS allocation, pass through
if (!all_committed && committed_size > 0) { if (!all_committed && committed_size > 0) {
@ -656,9 +659,6 @@ void _mi_arena_free(void* p, size_t size, size_t committed_size, mi_memid_t memi
return; return;
} }
// need to set all memory to undefined as some parts may still be marked as no_access (like padding etc.)
mi_track_mem_undefined(p,size);
// potentially decommit // potentially decommit
if (arena->memid.is_pinned || arena->blocks_committed == NULL) { if (arena->memid.is_pinned || arena->blocks_committed == NULL) {
mi_assert_internal(all_committed); mi_assert_internal(all_committed);

View file

@ -857,7 +857,7 @@ static mi_page_t* mi_find_page(mi_heap_t* heap, size_t size, size_t huge_alignme
// huge allocation? // huge allocation?
const size_t req_size = size - MI_PADDING_SIZE; // correct for padding_size in case of an overflow on `size` const size_t req_size = size - MI_PADDING_SIZE; // correct for padding_size in case of an overflow on `size`
if mi_unlikely(req_size > (MI_LARGE_OBJ_SIZE_MAX - MI_PADDING_SIZE) || huge_alignment > 0) { if mi_unlikely(req_size > (MI_LARGE_OBJ_SIZE_MAX - MI_PADDING_SIZE) || huge_alignment > 0) {
if mi_unlikely(req_size > MI_MAX_ALLOC_SIZE) { if mi_unlikely(req_size > MI_MAX_ALLOC_SIZE) {
_mi_error_message(EOVERFLOW, "allocation request is too large (%zu bytes)\n", req_size); _mi_error_message(EOVERFLOW, "allocation request is too large (%zu bytes)\n", req_size);
return NULL; return NULL;
} }

View file

@ -133,9 +133,9 @@ static void free_items(void* p) {
custom_free(p); custom_free(p);
} }
#ifdef HEAP_WALK #ifdef HEAP_WALK
static bool visit_blocks(const mi_heap_t* heap, const mi_heap_area_t* area, void* block, size_t block_size, void* arg) { static bool visit_blocks(const mi_heap_t* heap, const mi_heap_area_t* area, void* block, size_t block_size, void* arg) {
(void)(heap); (void)(area); (void)(heap); (void)(area);
size_t* total = (size_t*)arg; size_t* total = (size_t*)arg;
if (block != NULL) { if (block != NULL) {
*total += block_size; *total += block_size;
@ -260,7 +260,7 @@ static void test_leak(void) {
int main(int argc, char** argv) { int main(int argc, char** argv) {
#ifdef HEAP_WALK #ifdef HEAP_WALK
mi_option_enable(mi_option_visit_abandoned); mi_option_enable(mi_option_visit_abandoned);
#endif #endif
#ifndef NDEBUG #ifndef NDEBUG
mi_option_set(mi_option_arena_reserve, 32 * 1024 /* in kib = 32MiB */); mi_option_set(mi_option_arena_reserve, 32 * 1024 /* in kib = 32MiB */);