/*---------------------- 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
#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
/*---------------------- 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
#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
const HChar *function_names;
SizeT alloc_align;
SizeT dealloc_align;
+ Bool default_delete;
} AlignMismatch;
} 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);
&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;
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 );
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"
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) {
}
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:
}
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:
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) {
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) {