fix valgrind mem for large alignment

This commit is contained in:
Daan Leijen 2023-03-05 18:03:04 -08:00
parent 056c2ce45b
commit 82c85d1a13
2 changed files with 30 additions and 11 deletions

View file

@ -74,20 +74,17 @@ static mi_decl_noinline void* mi_heap_malloc_zero_aligned_at_fallback(mi_heap_t*
mi_assert_internal(mi_usable_size(p) == mi_usable_size(aligned_p)+adjust); mi_assert_internal(mi_usable_size(p) == mi_usable_size(aligned_p)+adjust);
// now zero the block if needed // now zero the block if needed
if (zero && alignment > MI_ALIGNMENT_MAX) { if (alignment > MI_ALIGNMENT_MAX) {
const ptrdiff_t diff = (uint8_t*)aligned_p - (uint8_t*)p; // for the tracker, on huge aligned allocations only from the start of the large block is defined
ptrdiff_t zsize = mi_page_usable_block_size(_mi_ptr_page(p)) - diff - MI_PADDING_SIZE; mi_track_mem_undefined(aligned_p, size);
#if MI_PADDING if (zero) {
zsize -= MI_MAX_ALIGN_SIZE; _mi_memzero(aligned_p, mi_usable_size(aligned_p));
#endif }
if (zsize > 0) { _mi_memzero(aligned_p, zsize); }
} }
#if MI_TRACK_ENABLED
if (p != aligned_p) { if (p != aligned_p) {
mi_track_align(p,aligned_p,adjust,mi_usable_size(aligned_p)); mi_track_align(p,aligned_p,adjust,mi_usable_size(aligned_p));
} }
#endif
return aligned_p; return aligned_p;
} }

View file

@ -5,7 +5,10 @@ terms of the MIT license. A copy of the license can be found in the file
"LICENSE" at the root of this distribution. "LICENSE" at the root of this distribution.
-----------------------------------------------------------------------------*/ -----------------------------------------------------------------------------*/
/* test file for valgrind support. /* test file for valgrind/asan support.
VALGRIND:
----------
Compile in an "out/debug" folder: Compile in an "out/debug" folder:
> cd out/debug > cd out/debug
@ -19,6 +22,25 @@ terms of the MIT license. A copy of the license can be found in the file
and test as: and test as:
> valgrind ./test-wrong > valgrind ./test-wrong
ASAN
----------
Compile in an "out/debug" folder:
> cd out/debug
> cmake ../.. -DMI_ASAN=1
> make -j8
and then compile this file as:
> clang -g -o test-wrong -I../../include ../../test/test-wrong.c libmimalloc-asan-debug.a -lpthread -fsanitize=address -fsanitize-recover=address
and test as:
> ASAN_OPTIONS=verbosity=1:halt_on_error=0 ./test-wrong
*/ */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>