From: Paul Floyd Date: Tue, 10 Oct 2023 22:01:40 +0000 (+0200) Subject: memcheck: add checking that new aligned is not deallocated by plain delete X-Git-Tag: VALGRIND_3_22_0~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e534908ce28736a64203dc74b9c54835aafff1e7;p=thirdparty%2Fvalgrind.git memcheck: add checking that new aligned is not deallocated by plain delete --- diff --git a/.gitignore b/.gitignore index 6769403f09..68f3a83762 100644 --- a/.gitignore +++ b/.gitignore @@ -934,6 +934,7 @@ /memcheck/tests/nanoleak /memcheck/tests/nanoleak2 /memcheck/tests/nanoleak_supp +/memcheck/tests/new_aligned_delete_default /memcheck/tests/new_delete_mismatch_size /memcheck/tests/new_nothrow /memcheck/tests/new_override diff --git a/coregrind/m_replacemalloc/vg_replace_malloc.c b/coregrind/m_replacemalloc/vg_replace_malloc.c index 23bd265759..e238a52f36 100644 --- a/coregrind/m_replacemalloc/vg_replace_malloc.c +++ b/coregrind/m_replacemalloc/vg_replace_malloc.c @@ -1025,31 +1025,47 @@ extern int * __error(void) __attribute__((weak)); /*---------------------- delete ----------------------*/ +#define DELETE(soname, fnname, vg_replacement, tag) \ + \ + void VG_REPLACE_FUNCTION_EZU(10050,soname,fnname) (void *p, SizeT size); \ + void VG_REPLACE_FUNCTION_EZU(10050,soname,fnname) (void *p, SizeT size) \ + { \ + struct AlignedAllocInfo aligned_alloc_info = { .mem=p, .alloc_kind=AllocKind##tag }; \ + \ + DO_INIT; \ + TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED((UWord)size); \ + VERIFY_ALIGNMENT(&aligned_alloc_info); \ + MALLOC_TRACE(#fnname "(%p)\n", p ); \ + if (p == NULL) \ + return; \ + (void)VALGRIND_NON_SIMD_CALL1( info.tl_##vg_replacement, p ); \ + } + #if defined(VGO_linux) // operator delete(void*), not mangled (for gcc 2.96) - FREE(VG_Z_LIBSTDCXX_SONAME, __builtin_delete, __builtin_delete ); - FREE(VG_Z_LIBC_SONAME, __builtin_delete, __builtin_delete ); + DELETE(VG_Z_LIBSTDCXX_SONAME, __builtin_delete, __builtin_delete, DeleteDefault ); + DELETE(VG_Z_LIBC_SONAME, __builtin_delete, __builtin_delete, DeleteDefault ); // operator delete(void*) - FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPv, __builtin_delete ); - FREE(VG_Z_LIBCXX_SONAME, _ZdlPv, __builtin_delete ); - FREE(VG_Z_LIBC_SONAME, _ZdlPv, __builtin_delete ); - FREE(SO_SYN_MALLOC, _ZdlPv, __builtin_delete ); + DELETE(VG_Z_LIBSTDCXX_SONAME, _ZdlPv, __builtin_delete, DeleteDefault ); + DELETE(VG_Z_LIBCXX_SONAME, _ZdlPv, __builtin_delete, DeleteDefault ); + DELETE(VG_Z_LIBC_SONAME, _ZdlPv, __builtin_delete, DeleteDefault ); + DELETE(SO_SYN_MALLOC, _ZdlPv, __builtin_delete, DeleteDefault ); #elif defined(VGO_freebsd) - FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPv, __builtin_delete ); - FREE(VG_Z_LIBCXX_SONAME, _ZdlPv, __builtin_delete ); - FREE(SO_SYN_MALLOC, _ZdlPv, __builtin_delete ); + DELETE(VG_Z_LIBSTDCXX_SONAME, _ZdlPv, __builtin_delete, DeleteDefault ); + DELETE(VG_Z_LIBCXX_SONAME, _ZdlPv, __builtin_delete, DeleteDefault ); + DELETE(SO_SYN_MALLOC, _ZdlPv, __builtin_delete, DeleteDefault ); #elif defined(VGO_darwin) // operator delete(void*) - FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPv, __builtin_delete ); - FREE(VG_Z_LIBCXX_SONAME, _ZdlPv, __builtin_delete ); - FREE(SO_SYN_MALLOC, _ZdlPv, __builtin_delete ); + DELETE(VG_Z_LIBSTDCXX_SONAME, _ZdlPv, __builtin_delete, DeleteDefault ); + DELETE(VG_Z_LIBCXX_SONAME, _ZdlPv, __builtin_delete, DeleteDefault ); + DELETE(SO_SYN_MALLOC, _ZdlPv, __builtin_delete, DeleteDefault ); #elif defined(VGO_solaris) // operator delete(void*) - FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPv, __builtin_delete ); - FREE(SO_SYN_MALLOC, _ZdlPv, __builtin_delete ); + DELETE(VG_Z_LIBSTDCXX_SONAME, _ZdlPv, __builtin_delete, DeleteDefault ); + DELETE(SO_SYN_MALLOC, _ZdlPv, __builtin_delete, DeleteDefault ); #endif @@ -1243,27 +1259,27 @@ extern int * __error(void) __attribute__((weak)); #if defined(VGO_linux) // operator delete(void*, std::nothrow_t const&) - FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete ); - FREE(VG_Z_LIBCXX_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete ); - FREE(VG_Z_LIBC_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete ); - FREE(SO_SYN_MALLOC, _ZdlPvRKSt9nothrow_t, __builtin_delete ); + DELETE(VG_Z_LIBSTDCXX_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete, DeleteDefault ); + DELETE(VG_Z_LIBCXX_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete, DeleteDefault ); + DELETE(VG_Z_LIBC_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete, DeleteDefault ); + DELETE(SO_SYN_MALLOC, _ZdlPvRKSt9nothrow_t, __builtin_delete, DeleteDefault ); #elif defined(VGO_freebsd) // operator delete(void*, std::nothrow_t const&) - FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete ); - FREE(VG_Z_LIBCXX_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete ); - FREE(SO_SYN_MALLOC, _ZdlPvRKSt9nothrow_t, __builtin_delete ); + DELETE(VG_Z_LIBSTDCXX_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete, DeleteDefault ); + DELETE(VG_Z_LIBCXX_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete, DeleteDefault ); + DELETE(SO_SYN_MALLOC, _ZdlPvRKSt9nothrow_t, __builtin_delete, DeleteDefault ); #elif defined(VGO_darwin) // operator delete(void*, std::nothrow_t const&) - FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete ); - FREE(VG_Z_LIBCXX_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete ); - FREE(SO_SYN_MALLOC, _ZdlPvRKSt9nothrow_t, __builtin_delete ); + DELETE(VG_Z_LIBSTDCXX_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete, DeleteDefault ); + DELETE(VG_Z_LIBCXX_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete, DeleteDefault ); + DELETE(SO_SYN_MALLOC, _ZdlPvRKSt9nothrow_t, __builtin_delete, DeleteDefault ); #elif defined(VGO_solaris) // operator delete(void*, std::nothrow_t const&) - FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete ); - FREE(SO_SYN_MALLOC, _ZdlPvRKSt9nothrow_t, __builtin_delete ); + DELETE(VG_Z_LIBSTDCXX_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete, DeleteDefault ); + DELETE(SO_SYN_MALLOC, _ZdlPvRKSt9nothrow_t, __builtin_delete, DeleteDefault ); #endif @@ -1302,31 +1318,33 @@ extern int * __error(void) __attribute__((weak)); /*---------------------- delete [] ----------------------*/ + + #if defined(VGO_linux) // operator delete[](void*), not mangled (for gcc 2.96) - FREE(VG_Z_LIBSTDCXX_SONAME, __builtin_vec_delete, __builtin_vec_delete ); - FREE(VG_Z_LIBC_SONAME, __builtin_vec_delete, __builtin_vec_delete ); + DELETE(VG_Z_LIBSTDCXX_SONAME, __builtin_vec_delete, __builtin_vec_delete, VecDeleteDefault ); + DELETE(VG_Z_LIBC_SONAME, __builtin_vec_delete, __builtin_vec_delete, VecDeleteDefault ); // operator delete[](void*) - FREE(VG_Z_LIBSTDCXX_SONAME, _ZdaPv, __builtin_vec_delete ); - FREE(VG_Z_LIBCXX_SONAME, _ZdaPv, __builtin_vec_delete ); - FREE(VG_Z_LIBC_SONAME, _ZdaPv, __builtin_vec_delete ); - FREE(SO_SYN_MALLOC, _ZdaPv, __builtin_vec_delete ); + DELETE(VG_Z_LIBSTDCXX_SONAME, _ZdaPv, __builtin_vec_delete, VecDeleteDefault ); + DELETE(VG_Z_LIBCXX_SONAME, _ZdaPv, __builtin_vec_delete, VecDeleteDefault ); + DELETE(VG_Z_LIBC_SONAME, _ZdaPv, __builtin_vec_delete, VecDeleteDefault ); + DELETE(SO_SYN_MALLOC, _ZdaPv, __builtin_vec_delete, VecDeleteDefault ); #elif defined(VGO_freebsd) // operator delete[](void*) - FREE(VG_Z_LIBSTDCXX_SONAME, _ZdaPv, __builtin_vec_delete ); - FREE(VG_Z_LIBCXX_SONAME, _ZdaPv, __builtin_vec_delete ); - FREE(SO_SYN_MALLOC, _ZdaPv, __builtin_vec_delete ); + DELETE(VG_Z_LIBSTDCXX_SONAME, _ZdaPv, __builtin_vec_delete, VecDeleteDefault ); + DELETE(VG_Z_LIBCXX_SONAME, _ZdaPv, __builtin_vec_delete, VecDeleteDefault ); + DELETE(SO_SYN_MALLOC, _ZdaPv, __builtin_vec_delete, VecDeleteDefault ); #elif defined(VGO_darwin) - FREE(VG_Z_LIBSTDCXX_SONAME, _ZdaPv, __builtin_vec_delete ); - FREE(VG_Z_LIBCXX_SONAME, _ZdaPv, __builtin_vec_delete ); - FREE(SO_SYN_MALLOC, _ZdaPv, __builtin_vec_delete ); + DELETE(VG_Z_LIBSTDCXX_SONAME, _ZdaPv, __builtin_vec_delete, VecDeleteDefault ); + DELETE(VG_Z_LIBCXX_SONAME, _ZdaPv, __builtin_vec_delete, VecDeleteDefault ); + DELETE(SO_SYN_MALLOC, _ZdaPv, __builtin_vec_delete, VecDeleteDefault ); #elif defined(VGO_solaris) // operator delete[](void*) - FREE(VG_Z_LIBSTDCXX_SONAME, _ZdaPv, __builtin_vec_delete ); - FREE(SO_SYN_MALLOC, _ZdaPv, __builtin_vec_delete ); + DELETE(VG_Z_LIBSTDCXX_SONAME, _ZdaPv, __builtin_vec_delete, VecDeleteDefault ); + DELETE(SO_SYN_MALLOC, _ZdaPv, __builtin_vec_delete, VecDeleteDefault ); #endif @@ -1466,27 +1484,27 @@ extern int * __error(void) __attribute__((weak)); #if defined(VGO_linux) // operator delete[](void*, std::nothrow_t const&) - FREE(VG_Z_LIBSTDCXX_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete ); - FREE(VG_Z_LIBCXX_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete ); - FREE(VG_Z_LIBC_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete ); - FREE(SO_SYN_MALLOC, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete ); + DELETE(VG_Z_LIBSTDCXX_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete, VecDeleteDefault ); + DELETE(VG_Z_LIBCXX_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete, VecDeleteDefault ); + DELETE(VG_Z_LIBC_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete, VecDeleteDefault ); + DELETE(SO_SYN_MALLOC, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete, VecDeleteDefault ); #elif defined(VGO_freebsd) // operator delete[](void*, std::nothrow_t const&) - FREE(VG_Z_LIBSTDCXX_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete ); - FREE(VG_Z_LIBCXX_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete ); - FREE(SO_SYN_MALLOC, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete ); + DELETE(VG_Z_LIBSTDCXX_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete, VecDeleteDefault ); + DELETE(VG_Z_LIBCXX_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete, VecDeleteDefault ); + DELETE(SO_SYN_MALLOC, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete, VecDeleteDefault ); #elif defined(VGO_darwin) // operator delete[](void*, std::nothrow_t const&) - FREE(VG_Z_LIBSTDCXX_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete ); - FREE(VG_Z_LIBCXX_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete ); - FREE(VG_Z_LIBC_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete ); + DELETE(VG_Z_LIBSTDCXX_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete, VecDeleteDefault ); + DELETE(VG_Z_LIBCXX_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete, VecDeleteDefault ); + DELETE(VG_Z_LIBC_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete, VecDeleteDefault ); #elif defined(VGO_solaris) // operator delete[](void*, std::nothrow_t const&) - FREE(VG_Z_LIBSTDCXX_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete ); - FREE(SO_SYN_MALLOC, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete ); + DELETE(VG_Z_LIBSTDCXX_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete, VecDeleteDefault ); + DELETE(SO_SYN_MALLOC, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete, VecDeleteDefault ); #endif diff --git a/include/pub_tool_replacemalloc.h b/include/pub_tool_replacemalloc.h index 41c51eeb36..4bddaa8943 100644 --- a/include/pub_tool_replacemalloc.h +++ b/include/pub_tool_replacemalloc.h @@ -94,6 +94,8 @@ typedef enum { AllocKindMemalign, AllocKindPosixMemalign, AllocKindAlignedAlloc, + AllocKindDeleteDefault, + AllocKindVecDeleteDefault, AllocKindDeleteSized, AllocKindVecDeleteSized, AllocKindNewAligned, diff --git a/memcheck/mc_errors.c b/memcheck/mc_errors.c index 5b83c69e50..a708b3f852 100644 --- a/memcheck/mc_errors.c +++ b/memcheck/mc_errors.c @@ -227,6 +227,7 @@ struct _MC_Error { const HChar *function_names; SizeT alloc_align; SizeT dealloc_align; + Bool default_delete; } AlignMismatch; } Err; }; @@ -831,14 +832,24 @@ void MC_(pp_Error) ( const Error* err ) case Err_AlignMismatch: if (xml) { emit( " MismatchedAllocateDeallocateAlignment\n" ); - emit( " Mismatched %s size alloc value: %lu dealloc value %lu\n", - extra->Err.SizeMismatch.function_names, extra->Err.AlignMismatch.alloc_align, extra->Err.AlignMismatch.dealloc_align ); + if (extra->Err.AlignMismatch.default_delete) { + emit( " Mismatched %s size alloc value: %lu dealloc value: default-aligned\n", + extra->Err.SizeMismatch.function_names, extra->Err.AlignMismatch.alloc_align ); + } else { + emit( " Mismatched %s size alloc value: %lu dealloc value: %lu\n", + extra->Err.SizeMismatch.function_names, extra->Err.AlignMismatch.alloc_align, extra->Err.AlignMismatch.dealloc_align ); + } VG_(pp_ExeContext)( VG_(get_error_where)(err) ); VG_(pp_addrinfo_mc)(VG_(get_error_address)(err), &extra->Err.AlignMismatch.ai, False); } else { - emit( "Mismatched %s alignment alloc value: %lu dealloc value: %lu\n", - extra->Err.AlignMismatch.function_names, extra->Err.AlignMismatch.alloc_align, extra->Err.AlignMismatch.dealloc_align ); + if (extra->Err.AlignMismatch.default_delete) { + emit( "Mismatched %s alignment alloc value: %lu dealloc value: default-aligned\n", + extra->Err.AlignMismatch.function_names, extra->Err.AlignMismatch.alloc_align ); + } else { + emit( "Mismatched %s alignment alloc value: %lu dealloc value: %lu\n", + extra->Err.AlignMismatch.function_names, extra->Err.AlignMismatch.alloc_align, extra->Err.AlignMismatch.dealloc_align ); + } VG_(pp_ExeContext)( VG_(get_error_where)(err) ); VG_(pp_addrinfo_mc)(VG_(get_error_address)(err), &extra->Err.AlignMismatch.ai, False); @@ -1098,7 +1109,7 @@ void MC_(record_size_mismatch_error) ( ThreadId tid, MC_Chunk* mc, SizeT size, c &extra ); } -void MC_(record_align_mismatch_error) ( ThreadId tid, MC_Chunk* mc, SizeT align, const HChar *function_names ) +void MC_(record_align_mismatch_error) ( ThreadId tid, MC_Chunk* mc, SizeT align, Bool default_delete, const HChar *function_names ) { MC_Error extra; AddrInfo* ai = &extra.Err.AlignMismatch.ai; @@ -1113,6 +1124,7 @@ void MC_(record_align_mismatch_error) ( ThreadId tid, MC_Chunk* mc, SizeT align, ai->Addr.Block.freed_at = MC_(freed_at) (mc); extra.Err.AlignMismatch.alloc_align = mc->alignB; extra.Err.AlignMismatch.dealloc_align = align; + extra.Err.AlignMismatch.default_delete = default_delete; extra.Err.AlignMismatch.function_names = function_names; VG_(maybe_record_error)( tid, Err_AlignMismatch, mc->data, /*s*/NULL, &extra ); @@ -1256,7 +1268,10 @@ Bool MC_(eq_Error) ( VgRes res, const Error* e1, const Error* e2 ) extra2->Err.AlignMismatch.alloc_align && extra1->Err.AlignMismatch.dealloc_align == - extra2->Err.AlignMismatch.dealloc_align; + extra2->Err.AlignMismatch.dealloc_align + && + extra1->Err.AlignMismatch.default_delete == + extra2->Err.AlignMismatch.default_delete; case Err_Leak: VG_(tool_panic)("Shouldn't get Err_Leak in mc_eq_Error,\n" diff --git a/memcheck/mc_include.h b/memcheck/mc_include.h index e068f49db9..acc595a745 100644 --- a/memcheck/mc_include.h +++ b/memcheck/mc_include.h @@ -580,7 +580,7 @@ Bool MC_(record_leak_error) ( ThreadId tid, Bool MC_(record_fishy_value_error) ( ThreadId tid, const HChar* function, const HChar *argument_name, SizeT value ); void MC_(record_size_mismatch_error) ( ThreadId tid, MC_Chunk* mc, SizeT size, const HChar *function_names ); -void MC_(record_align_mismatch_error) ( ThreadId tid, MC_Chunk* mc, SizeT align, const HChar *function_names ); +void MC_(record_align_mismatch_error) ( ThreadId tid, MC_Chunk* mc, SizeT align, Bool default_delete, const HChar *function_names ); /* Leak kinds tokens to call VG_(parse_enum_set). */ diff --git a/memcheck/mc_main.c b/memcheck/mc_main.c index 23d789dd6b..be237eeb42 100644 --- a/memcheck/mc_main.c +++ b/memcheck/mc_main.c @@ -7278,6 +7278,12 @@ static Bool mc_handle_client_request ( ThreadId tid, UWord* arg, UWord* ret ) MC_(record_bad_alignment) ( tid, aligned_alloc_info->orig_alignment , 0U, " (should be non-zero and a power of 2)" ); } break; + case AllocKindDeleteDefault: + mc = VG_(HT_lookup) ( MC_(malloc_list), (UWord)aligned_alloc_info->mem ); + if (mc && mc->alignB) { + MC_(record_align_mismatch_error) ( tid, mc, 0U, True, "new/delete"); + } + break; case AllocKindDeleteAligned: if (aligned_alloc_info->orig_alignment == 0 || (aligned_alloc_info->orig_alignment & (aligned_alloc_info->orig_alignment - 1)) != 0) { @@ -7285,7 +7291,13 @@ static Bool mc_handle_client_request ( ThreadId tid, UWord* arg, UWord* ret ) } mc = VG_(HT_lookup) ( MC_(malloc_list), (UWord)aligned_alloc_info->mem ); if (mc && aligned_alloc_info->orig_alignment != mc->alignB) { - MC_(record_align_mismatch_error) ( tid, mc, aligned_alloc_info->orig_alignment, "new/delete"); + MC_(record_align_mismatch_error) ( tid, mc, aligned_alloc_info->orig_alignment, False, "new/delete"); + } + break; + case AllocKindVecDeleteDefault: + mc = VG_(HT_lookup) ( MC_(malloc_list), (UWord)aligned_alloc_info->mem ); + if (mc && mc->alignB) { + MC_(record_align_mismatch_error) ( tid, mc, 0U, True, "new[]/delete[]"); } break; case AllocKindVecDeleteAligned: @@ -7295,7 +7307,7 @@ static Bool mc_handle_client_request ( ThreadId tid, UWord* arg, UWord* ret ) } mc = VG_(HT_lookup) ( MC_(malloc_list), (UWord)aligned_alloc_info->mem ); if (mc && aligned_alloc_info->orig_alignment != mc->alignB) { - MC_(record_align_mismatch_error) ( tid, mc, aligned_alloc_info->orig_alignment, "new[]/delete[]"); + MC_(record_align_mismatch_error) ( tid, mc, aligned_alloc_info->orig_alignment, False, "new[]/delete[]"); } break; case AllocKindDeleteSizedAligned: @@ -7304,7 +7316,7 @@ static Bool mc_handle_client_request ( ThreadId tid, UWord* arg, UWord* ret ) MC_(record_size_mismatch_error) ( tid, mc, aligned_alloc_info->size, "new/delete"); } if (mc && aligned_alloc_info->orig_alignment != mc->alignB) { - MC_(record_align_mismatch_error) ( tid, mc, aligned_alloc_info->orig_alignment, "new/delete"); + MC_(record_align_mismatch_error) ( tid, mc, aligned_alloc_info->orig_alignment, False, "new/delete"); } if (aligned_alloc_info->orig_alignment == 0 || (aligned_alloc_info->orig_alignment & (aligned_alloc_info->orig_alignment - 1)) != 0) { @@ -7317,7 +7329,7 @@ static Bool mc_handle_client_request ( ThreadId tid, UWord* arg, UWord* ret ) MC_(record_size_mismatch_error) ( tid, mc, aligned_alloc_info->size, "new[]/delete[]" ); } if (mc && aligned_alloc_info->orig_alignment != mc->alignB) { - MC_(record_align_mismatch_error) ( tid, mc, aligned_alloc_info->orig_alignment, "new[]/delete[]"); + MC_(record_align_mismatch_error) ( tid, mc, aligned_alloc_info->orig_alignment, False, "new[]/delete[]"); } if (aligned_alloc_info->orig_alignment == 0 || (aligned_alloc_info->orig_alignment & (aligned_alloc_info->orig_alignment - 1)) != 0) { diff --git a/memcheck/mc_malloc_wrappers.c b/memcheck/mc_malloc_wrappers.c index f2fe1f74c6..48f26902cd 100644 --- a/memcheck/mc_malloc_wrappers.c +++ b/memcheck/mc_malloc_wrappers.c @@ -187,10 +187,6 @@ MC_Chunk* MC_(get_freed_block_bracketting) (Addr a) return NULL; } -// @todo PJF !!!!!!!!!! -// below alignB is the cleanup up value -// would prefer the original value !!!!!!!!! - /* Allocate a shadow chunk, put it on the appropriate list. If needed, release oldest blocks from freed list. */ static diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am index 4442d945cc..12d9595668 100644 --- a/memcheck/tests/Makefile.am +++ b/memcheck/tests/Makefile.am @@ -171,6 +171,8 @@ EXTRA_DIST = \ sized_aligned_new_delete_misaligned3_supp.supp \ sized_aligned_new_delete_misaligned3_supp.stderr.exp \ sized_aligned_new_delete_misaligned3_supp.stderr.exp_32 \ + new_aligned_delete_default.stderr.exp \ + new_aligned_delete_default.vgtest \ new_delete_mismatch_size.stderr.exp \ new_delete_mismatch_size.vgtest \ new_delete_mismatch_size_supp.stderr.exp \ @@ -557,6 +559,7 @@ endif if HAVE_ALIGNED_CXX_ALLOC check_PROGRAMS += cxx17_aligned_new sized_aligned_new_delete_args \ + new_aligned_delete_default \ sized_aligned_new_delete_misaligned1 \ sized_aligned_new_delete_misaligned2 \ sized_aligned_new_delete_misaligned3 @@ -621,6 +624,8 @@ bug340392_CFLAGS = $(AM_CFLAGS) -O3 @FLAG_W_NO_MAYBE_UNINITIALIZED@ if HAVE_ALIGNED_CXX_ALLOC cxx17_aligned_new_SOURCES = cxx17_aligned_new.cpp cxx17_aligned_new_CXXFLAGS = -std=c++17 @FLAG_W_NO_MISMATCHED_NEW_DELETE@ +new_aligned_delete_default_SOURCES = new_aligned_delete_default.cpp +new_aligned_delete_default_CXXFLAGS = ${AM_CXXFLAGS} -std=c++17 sized_aligned_new_delete_args_SOURCES = sized_aligned_new_delete_args.cpp sized_aligned_new_delete_args_CXXFLAGS = ${AM_CXXFLAGS} -std=c++17 sized_aligned_new_delete_misaligned1_SOURCES = sized_aligned_new_delete_misaligned1.cpp diff --git a/memcheck/tests/new_aligned_delete_default.cpp b/memcheck/tests/new_aligned_delete_default.cpp new file mode 100644 index 0000000000..3d056643ab --- /dev/null +++ b/memcheck/tests/new_aligned_delete_default.cpp @@ -0,0 +1,14 @@ +#include + +int main() +{ + std::nothrow_t tag; + void *mem = operator new(1024U, static_cast(256U)); + operator delete(mem); + mem = operator new[](1024U, static_cast(256U)); + operator delete[](mem); + mem = operator new(1024U, static_cast(256U), tag); + operator delete(mem); + mem = operator new[](1024U, static_cast(256U), tag); + operator delete[](mem); +} diff --git a/memcheck/tests/new_aligned_delete_default.stderr.exp b/memcheck/tests/new_aligned_delete_default.stderr.exp new file mode 100644 index 0000000000..3107df2569 --- /dev/null +++ b/memcheck/tests/new_aligned_delete_default.stderr.exp @@ -0,0 +1,28 @@ +Mismatched new/delete alignment alloc value: 256 dealloc value: default-aligned + at 0x........: ...operator delete... (vg_replace_malloc.c:...) + by 0x........: main (new_aligned_delete_default.cpp:7) + Address 0x........ is 0 bytes inside a block of size 1,024 alloc'd + at 0x........: operator new(unsigned long, std::align_val_t) (vg_replace_malloc.c:...) + by 0x........: main (new_aligned_delete_default.cpp:6) + +Mismatched new[]/delete[] alignment alloc value: 256 dealloc value: default-aligned + at 0x........: ...operator delete[]... (vg_replace_malloc.c:...) + by 0x........: main (new_aligned_delete_default.cpp:9) + Address 0x........ is 0 bytes inside a block of size 1,024 alloc'd + at 0x........: operator new[](unsigned long, std::align_val_t) (vg_replace_malloc.c:...) + by 0x........: main (new_aligned_delete_default.cpp:8) + +Mismatched new/delete alignment alloc value: 256 dealloc value: default-aligned + at 0x........: ...operator delete... (vg_replace_malloc.c:...) + by 0x........: main (new_aligned_delete_default.cpp:11) + Address 0x........ is 0 bytes inside a block of size 1,024 alloc'd + at 0x........: operator new(unsigned long, std::align_val_t, std::nothrow_t const&) (vg_replace_malloc.c:...) + by 0x........: main (new_aligned_delete_default.cpp:10) + +Mismatched new[]/delete[] alignment alloc value: 256 dealloc value: default-aligned + at 0x........: ...operator delete[]... (vg_replace_malloc.c:...) + by 0x........: main (new_aligned_delete_default.cpp:13) + Address 0x........ is 0 bytes inside a block of size 1,024 alloc'd + at 0x........: operator new[](unsigned long, std::align_val_t, std::nothrow_t const&) (vg_replace_malloc.c:...) + by 0x........: main (new_aligned_delete_default.cpp:12) + diff --git a/memcheck/tests/new_aligned_delete_default.vgtest b/memcheck/tests/new_aligned_delete_default.vgtest new file mode 100644 index 0000000000..b55034bc04 --- /dev/null +++ b/memcheck/tests/new_aligned_delete_default.vgtest @@ -0,0 +1,5 @@ +prog: new_aligned_delete_default +prereq: test -e ./new_aligned_delete_default +vgopts: --show-mismatched-frees=yes -q +#stderr_filter: filter_size_t + diff --git a/memcheck/tests/sized_aligned_new_delete_misaligned1_xml.stderr.exp b/memcheck/tests/sized_aligned_new_delete_misaligned1_xml.stderr.exp index 6eff1c8507..b8e230165c 100644 --- a/memcheck/tests/sized_aligned_new_delete_misaligned1_xml.stderr.exp +++ b/memcheck/tests/sized_aligned_new_delete_misaligned1_xml.stderr.exp @@ -107,7 +107,7 @@ 0x........ ... MismatchedAllocateDeallocateAlignment - Mismatched new/delete size alloc value: 64 dealloc value 63 + Mismatched new/delete size alloc value: 64 dealloc value: 63 0x........ @@ -176,7 +176,7 @@ 0x........ ... MismatchedAllocateDeallocateAlignment - Mismatched new[]/delete[] size alloc value: 64 dealloc value 63 + Mismatched new[]/delete[] size alloc value: 64 dealloc value: 63 0x........ @@ -320,7 +320,7 @@ 0x........ ... MismatchedAllocateDeallocateAlignment - Mismatched new/delete size alloc value: 64 dealloc value 63 + Mismatched new/delete size alloc value: 64 dealloc value: 63 0x........ @@ -389,7 +389,7 @@ 0x........ ... MismatchedAllocateDeallocateAlignment - Mismatched new[]/delete[] size alloc value: 64 dealloc value 63 + Mismatched new[]/delete[] size alloc value: 64 dealloc value: 63 0x........