]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
memcheck: add checking that new aligned is not deallocated by plain delete
authorPaul Floyd <pjfloyd@wanadoo.fr>
Tue, 10 Oct 2023 22:01:40 +0000 (00:01 +0200)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Wed, 11 Oct 2023 05:37:57 +0000 (07:37 +0200)
12 files changed:
.gitignore
coregrind/m_replacemalloc/vg_replace_malloc.c
include/pub_tool_replacemalloc.h
memcheck/mc_errors.c
memcheck/mc_include.h
memcheck/mc_main.c
memcheck/mc_malloc_wrappers.c
memcheck/tests/Makefile.am
memcheck/tests/new_aligned_delete_default.cpp [new file with mode: 0644]
memcheck/tests/new_aligned_delete_default.stderr.exp [new file with mode: 0644]
memcheck/tests/new_aligned_delete_default.vgtest [new file with mode: 0644]
memcheck/tests/sized_aligned_new_delete_misaligned1_xml.stderr.exp

index 6769403f09b69ec156fb86719e9f3c0cf2a2fb72..68f3a837627e0add0353d60c7697fee0ca2b78bc 100644 (file)
 /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
index 23bd2657592da6aeb0b072f1391d8bf895a725a0..e238a52f3675113acc28c437d35f6e7f433bd43d 100644 (file)
@@ -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
 
index 41c51eeb36d86e6c2da6de5c8b7211bacf078293..4bddaa89433c97d669707f3f8a05850091fb507d 100644 (file)
@@ -94,6 +94,8 @@ typedef enum {
    AllocKindMemalign,
    AllocKindPosixMemalign,
    AllocKindAlignedAlloc,
+   AllocKindDeleteDefault,
+   AllocKindVecDeleteDefault,
    AllocKindDeleteSized,
    AllocKindVecDeleteSized,
    AllocKindNewAligned,
index 5b83c69e50b2ab3d0efa3bc213acbc652a7295c2..a708b3f8521017100d66aefbf83327b4bcdc6ca3 100644 (file)
@@ -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( "  <kind>MismatchedAllocateDeallocateAlignment</kind>\n" );
-            emit( "  <what>Mismatched %s size alloc value: %lu dealloc value %lu</what>\n",
-                  extra->Err.SizeMismatch.function_names, extra->Err.AlignMismatch.alloc_align, extra->Err.AlignMismatch.dealloc_align );
+            if (extra->Err.AlignMismatch.default_delete) {
+               emit( "  <what>Mismatched %s size alloc value: %lu dealloc value: default-aligned</what>\n",
+                    extra->Err.SizeMismatch.function_names, extra->Err.AlignMismatch.alloc_align );
+            } else {
+               emit( "  <what>Mismatched %s size alloc value: %lu dealloc value: %lu</what>\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"
index e068f49db99fb14707050f3a4d2811f9565f118f..acc595a745e9800128d877f824afd5a5eacec634 100644 (file)
@@ -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). */
index 23d789dd6be9ae00474cd79e286fa11366f17759..be237eeb422039a3cd04a02ab52aa4b4736fb33d 100644 (file)
@@ -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) {
index f2fe1f74c6b300de697b33b7895370cbe38ecd41..48f26902cde327de517c7c136073703e1da98034 100644 (file)
@@ -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
index 4442d945ccc480ea3ae3917242a8ffb1582ad9c6..12d959566881b3ddf90dd782f2f6503bff9e5711 100644 (file)
@@ -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 (file)
index 0000000..3d05664
--- /dev/null
@@ -0,0 +1,14 @@
+#include <new>
+
+int main()
+{
+   std::nothrow_t tag;
+   void *mem = operator new(1024U, static_cast<std::align_val_t>(256U));
+   operator delete(mem);
+   mem = operator new[](1024U, static_cast<std::align_val_t>(256U));
+   operator delete[](mem);
+   mem = operator new(1024U, static_cast<std::align_val_t>(256U), tag);
+   operator delete(mem);
+   mem = operator new[](1024U, static_cast<std::align_val_t>(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 (file)
index 0000000..3107df2
--- /dev/null
@@ -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 (file)
index 0000000..b55034b
--- /dev/null
@@ -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
+
index 6eff1c85070e23c185dc5697d63436b5106cddc5..b8e230165c8ebca70147482e25bdb51e255ca17f 100644 (file)
   <unique>0x........</unique>
   <tid>...</tid>
   <kind>MismatchedAllocateDeallocateAlignment</kind>
-  <what>Mismatched new/delete size alloc value: 64 dealloc value 63</what>
+  <what>Mismatched new/delete size alloc value: 64 dealloc value: 63</what>
   <stack>
     <frame>
       <ip>0x........</ip>
   <unique>0x........</unique>
   <tid>...</tid>
   <kind>MismatchedAllocateDeallocateAlignment</kind>
-  <what>Mismatched new[]/delete[] size alloc value: 64 dealloc value 63</what>
+  <what>Mismatched new[]/delete[] size alloc value: 64 dealloc value: 63</what>
   <stack>
     <frame>
       <ip>0x........</ip>
   <unique>0x........</unique>
   <tid>...</tid>
   <kind>MismatchedAllocateDeallocateAlignment</kind>
-  <what>Mismatched new/delete size alloc value: 64 dealloc value 63</what>
+  <what>Mismatched new/delete size alloc value: 64 dealloc value: 63</what>
   <stack>
     <frame>
       <ip>0x........</ip>
   <unique>0x........</unique>
   <tid>...</tid>
   <kind>MismatchedAllocateDeallocateAlignment</kind>
-  <what>Mismatched new[]/delete[] size alloc value: 64 dealloc value 63</what>
+  <what>Mismatched new[]/delete[] size alloc value: 64 dealloc value: 63</what>
   <stack>
     <frame>
       <ip>0x........</ip>