From: Otto Moerbeek <[email protected]>
Date: Tue, 5 Sep 2023 07:40:18 +0200
> On Tue, Sep 05, 2023 at 09:38:40AM +0900, Masato Asou wrote:
>
>> hi,
>>
>> I have fixed a bug in Valgrind. The Valgrind could not detect access
>> outside the range of malloc.
>>
>> comments, ok?
>
> This works much better that before. Thanks for working on this!
>
> It now detects out of bounds read and writes correctly. A double
> free is detected.
> Also, the spurious reports for accesses to errno are gone.
Thank you for your comment.
> It does not report proper locations though, even if I compile my test
> program with -g:
Could you show me your test program?
--
ASOU Masato
> ==23912== Invalid read of size 1
> ==23912== at 0x109B5D: ??? (in ./a.out)
> ==23912== by 0x1098D1: ??? (in ./a.out)
> ==23912== Address 0x4a42840 is 0 bytes after a block of size 10,240 alloc'd
> ==23912== at 0x493A3A9: malloc (vg_replace_malloc.c:435)
> ==23912== by 0x109B32: ??? (in ./a.out)
> ==23912== by 0x1098D1: ??? (in ./a.out)
> ==23912==
> 0
> ==23912== Invalid free() / delete / delete[] / realloc()
> ==23912== at 0x493C981: free (vg_replace_malloc.c:978)
> ==23912== by 0x109B80: ??? (in ./a.out)
> ==23912== by 0x1098D1: ??? (in ./a.out)
> ==23912== Address 0x4a40040 is 0 bytes inside a block of size 10,240 free'd
> ==23912== at 0x493C981: free (vg_replace_malloc.c:978)
> ==23912== by 0x109B77: ??? (in ./a.out)
> ==23912== by 0x1098D1: ??? (in ./a.out)
> ==23912== Block was alloc'd at
> ==23912== at 0x493A3A9: malloc (vg_replace_malloc.c:435)
> ==23912== by 0x109B32: ??? (in ./a.out)
> ==23912== by 0x1098D1: ??? (in ./a.out)
>
> addr2line -e ./a.out 0x109B80 also does not succeed in translating the
> address.
>
> There are also a few spurious reports of the form:
>
> ==23912== Use of uninitialised value of size 8
> ==23912== at 0x499518D: write (sys/w_write.c:26)
> ==23912== by 0x49E9FB2: __sflush (stdio/fflush.c:80)
> ==23912== by 0x49DA548: __sfvwrite (stdio/fvwrite.c:191)
> ==23912== by 0x49E42ED: __sprint (stdio/vfprintf.c:108)
> ==23912== by 0x49E42ED: __vfprintf (stdio/vfprintf.c:1064)
> ==23912== by 0x49E0FA5: vfprintf (stdio/vfprintf.c:263)
> ==23912== by 0x49F7C74: printf (stdio/printf.c:44)
> ==23912== by 0x109B48: ??? (in ./a.out)
> ==23912== by 0x1098D1: ??? (in ./a.out)
>
> But it is a great improvement,
>
> -Otto
>
>> --
>> ASOU Masato
>>
>> Index: devel/valgrind/Makefile
>> ===================================================================
>> RCS file: /cvs/ports/devel/valgrind/Makefile,v
>> retrieving revision 1.31
>> diff -u -p -r1.31 Makefile
>> --- devel/valgrind/Makefile 5 Aug 2023 03:32:22 -0000 1.31
>> +++ devel/valgrind/Makefile 4 Sep 2023 23:14:33 -0000
>> @@ -5,7 +5,7 @@ CATEGORIES = devel
>>
>> V = 3.21.0
>> DISTNAME = valgrind-${V}
>> -REVISION = 0
>> +REVISION = 1
>> EXTRACT_SUFX = .tar.bz2
>>
>> MASTER_SITES = https://sourceware.org/pub/valgrind/
>> Index:
>> devel/valgrind/patches/patch-coregrind_m_replacemalloc_vg_replace_malloc_c
>> ===================================================================
>> RCS file:
>> devel/valgrind/patches/patch-coregrind_m_replacemalloc_vg_replace_malloc_c
>> diff -N
>> devel/valgrind/patches/patch-coregrind_m_replacemalloc_vg_replace_malloc_c
>> --- /dev/null 1 Jan 1970 00:00:00 -0000
>> +++
>> devel/valgrind/patches/patch-coregrind_m_replacemalloc_vg_replace_malloc_c
>> 4 Sep 2023 23:14:33 -0000
>> @@ -0,0 +1,263 @@
>> +--- coregrind/m_replacemalloc/vg_replace_malloc.c.orig
>> ++++ coregrind/m_replacemalloc/vg_replace_malloc.c
>> +@@ -222,7 +222,7 @@
>> + #define SET_ERRNO_ENOMEM if (__errno_location) \
>> + (*__errno_location ()) = VKI_ENOMEM;
>> + #define SET_ERRNO_EINVAL {}
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + extern int *__error (void) __attribute__((weak));
>> + #define SET_ERRNO_ENOMEM if (__error) \
>> + (*__error ()) = VKI_ENOMEM;
>> +@@ -430,7 +430,7 @@
>> + ALLOC_or_NULL(VG_Z_LIBC_SONAME, malloc, malloc);
>> + ALLOC_or_NULL(SO_SYN_MALLOC, malloc, malloc);
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + ALLOC_or_NULL(VG_Z_LIBC_SONAME, malloc, malloc);
>> + ALLOC_or_NULL(SO_SYN_MALLOC, malloc, malloc);
>> +
>> +@@ -472,7 +472,7 @@
>> + ALLOC_or_BOMB(SO_SYN_MALLOC, _Znwm, __builtin_new);
>> + #endif
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + // operator new(unsigned int)
>> + #if VG_WORDSIZE == 4
>> + ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znwj, __builtin_new);
>> +@@ -532,7 +532,7 @@
>> + ALLOC_or_BOMB_ALIGNED(SO_SYN_MALLOC, _ZnwmSt11align_val_t,
>> __builtin_new_aligned);
>> + #endif
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + // operator new(unsigned int)
>> + #if VG_WORDSIZE == 4
>> + ALLOC_or_BOMB_ALIGNED(VG_Z_LIBSTDCXX_SONAME, _ZnwjSt11align_val_t,
>> __builtin_new_aligned);
>> +@@ -592,7 +592,7 @@
>> + ALLOC_or_NULL(SO_SYN_MALLOC, _ZnwmRKSt9nothrow_t,
>> __builtin_new);
>> + #endif
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + // operator new(unsigned, std::nothrow_t const&)
>> + #if VG_WORDSIZE == 4
>> + ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnwjRKSt9nothrow_t,
>> __builtin_new);
>> +@@ -652,7 +652,7 @@
>> + ALLOC_or_NULL_ALIGNED(SO_SYN_MALLOC,
>> _ZnwmSt11align_val_tRKSt9nothrow_t, __builtin_new_aligned);
>> + #endif
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + // operator new(unsigned int, std::align_val_t, std::nothrow_t const&)
>> + #if VG_WORDSIZE == 4
>> + ALLOC_or_NULL_ALIGNED(VG_Z_LIBSTDCXX_SONAME,
>> _ZnwjSt11align_val_tRKSt9nothrow_t, __builtin_new_aligned);
>> +@@ -714,7 +714,7 @@
>> + ALLOC_or_BOMB(SO_SYN_MALLOC, _Znam,
>> __builtin_vec_new );
>> + #endif
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + // operator new[](unsigned int)
>> + #if VG_WORDSIZE == 4
>> + ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znaj,
>> __builtin_vec_new );
>> +@@ -774,7 +774,7 @@
>> + ALLOC_or_BOMB_ALIGNED(SO_SYN_MALLOC, _ZnamSt11align_val_t,
>> __builtin_vec_new_aligned );
>> + #endif
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + // operator new[](unsigned int, std::align_val_t)
>> + #if VG_WORDSIZE == 4
>> + ALLOC_or_BOMB_ALIGNED(VG_Z_LIBSTDCXX_SONAME, _ZnajSt11align_val_t,
>> __builtin_vec_new_aligned );
>> +@@ -835,7 +835,7 @@
>> + ALLOC_or_NULL(SO_SYN_MALLOC, _ZnamRKSt9nothrow_t,
>> __builtin_vec_new );
>> + #endif
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + // operator new[](unsigned, std::nothrow_t const&)
>> + #if VG_WORDSIZE == 4
>> + ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnajRKSt9nothrow_t,
>> __builtin_vec_new );
>> +@@ -895,7 +895,7 @@
>> + ALLOC_or_NULL_ALIGNED(SO_SYN_MALLOC,
>> _ZnamSt11align_val_tRKSt9nothrow_t, __builtin_vec_new_aligned );
>> + #endif
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + // operator new[](unsigned int, std::align_val_t, std::nothrow_t const&)
>> + #if VG_WORDSIZE == 4
>> + ALLOC_or_NULL_ALIGNED(VG_Z_LIBSTDCXX_SONAME,
>> _ZnajSt11align_val_tRKSt9nothrow_t, __builtin_vec_new_aligned );
>> +@@ -973,7 +973,7 @@
>> + FREE(VG_Z_LIBC_SONAME, free, free );
>> + FREE(SO_SYN_MALLOC, free, free );
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + FREE(VG_Z_LIBC_SONAME, free, free );
>> + FREE(SO_SYN_MALLOC, free, free );
>> +
>> +@@ -1024,7 +1024,7 @@
>> + FREE(VG_Z_LIBC_SONAME, _ZdlPv, __builtin_delete );
>> + FREE(SO_SYN_MALLOC, _ZdlPv, __builtin_delete );
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPv, __builtin_delete );
>> + FREE(VG_Z_LIBCXX_SONAME, _ZdlPv, __builtin_delete );
>> + FREE(SO_SYN_MALLOC, _ZdlPv, __builtin_delete );
>> +@@ -1072,7 +1072,7 @@
>> + DELETE_SIZED(SO_SYN_MALLOC, _ZdlPvm,
>> __builtin_delete );
>> + #endif
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + // operator delete(void*, unsigned int)
>> + #if __SIZEOF_SIZE_T__ == 4
>> + DELETE_SIZED(VG_Z_LIBSTDCXX_SONAME, _ZdlPvj,
>> __builtin_delete );
>> +@@ -1160,7 +1160,7 @@
>> + DELETE_SIZED_ALIGNED(SO_SYN_MALLOC, _ZdlPvmSt11align_val_t,
>> __builtin_delete_aligned );
>> + #endif
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + // operator delete(void*, std::align_val_t)
>> + DELETE_ALIGNED(VG_Z_LIBSTDCXX_SONAME, _ZdlPvSt11align_val_t,
>> __builtin_delete_aligned );
>> + DELETE_ALIGNED(VG_Z_LIBCXX_SONAME, _ZdlPvSt11align_val_t,
>> __builtin_delete_aligned );
>> +@@ -1224,7 +1224,7 @@
>> + FREE(VG_Z_LIBC_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete );
>> + FREE(SO_SYN_MALLOC, _ZdlPvRKSt9nothrow_t, __builtin_delete );
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + // 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 );
>> +@@ -1254,7 +1254,7 @@
>> +
>> + // no sized version of this operator
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + // operator delete(void*, std::align_val_t, std::nothrow_t const&)
>> + DELETE_ALIGNED(VG_Z_LIBSTDCXX_SONAME,
>> _ZdlPvSt11align_val_tRKSt9nothrow_t, __builtin_delete_aligned );
>> + DELETE_ALIGNED(VG_Z_LIBCXX_SONAME,
>> _ZdlPvSt11align_val_tRKSt9nothrow_t, __builtin_delete_aligned );
>> +@@ -1288,7 +1288,7 @@
>> + FREE(VG_Z_LIBC_SONAME, _ZdaPv, __builtin_vec_delete );
>> + FREE(SO_SYN_MALLOC, _ZdaPv, __builtin_vec_delete );
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + // operator delete[](void*)
>> + FREE(VG_Z_LIBSTDCXX_SONAME, _ZdaPv, __builtin_vec_delete );
>> + FREE(VG_Z_LIBCXX_SONAME, _ZdaPv, __builtin_vec_delete );
>> +@@ -1323,7 +1323,7 @@
>> + DELETE_SIZED(SO_SYN_MALLOC, _ZdaPvm,
>> __builtin_vec_delete );
>> + #endif
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + // operator delete[](void*, unsigned int)
>> + #if __SIZEOF_SIZE_T__ == 4
>> + DELETE_SIZED(VG_Z_LIBSTDCXX_SONAME, _ZdaPvj,
>> __builtin_vec_delete );
>> +@@ -1383,7 +1383,7 @@
>> + DELETE_SIZED_ALIGNED(SO_SYN_MALLOC, _ZdaPvmSt11align_val_t,
>> __builtin_vec_delete_aligned );
>> + #endif
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + // operator delete[](void*, std::align_val_t)
>> + DELETE_ALIGNED(VG_Z_LIBSTDCXX_SONAME, _ZdaPvSt11align_val_t,
>> __builtin_vec_delete_aligned );
>> + DELETE_ALIGNED(VG_Z_LIBCXX_SONAME, _ZdaPvSt11align_val_t,
>> __builtin_vec_delete_aligned );
>> +@@ -1447,7 +1447,7 @@
>> + FREE(VG_Z_LIBC_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete );
>> + FREE(SO_SYN_MALLOC, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete );
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + // 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 );
>> +@@ -1477,7 +1477,7 @@
>> +
>> + // no sized version of this operator
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + // operator delete[](void*, std::align_val_t, std::nothrow_t const&)
>> + DELETE_ALIGNED(VG_Z_LIBSTDCXX_SONAME,
>> _ZdaPvSt11align_val_tRKSt9nothrow_t, __builtin_vec_delete_aligned );
>> + DELETE_ALIGNED(VG_Z_LIBCXX_SONAME,
>> _ZdaPvSt11align_val_tRKSt9nothrow_t, __builtin_vec_delete_aligned );
>> +@@ -1553,7 +1553,7 @@
>> + CALLOC(VG_Z_LIBC_SONAME, calloc);
>> + CALLOC(SO_SYN_MALLOC, calloc);
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + CALLOC(VG_Z_LIBC_SONAME, calloc);
>> + CALLOC(SO_SYN_MALLOC, calloc);
>> +
>> +@@ -1648,7 +1648,7 @@
>> + REALLOC(VG_Z_LIBC_SONAME, realloc);
>> + REALLOC(SO_SYN_MALLOC, realloc);
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + REALLOC(VG_Z_LIBC_SONAME, realloc);
>> + REALLOC(SO_SYN_MALLOC, realloc);
>> + REALLOCF(VG_Z_LIBC_SONAME, reallocf);
>> +@@ -1734,7 +1734,7 @@
>> + return v; \
>> + }
>> +
>> +-#if defined(VGO_freebsd)
>> ++#if defined(VGO_freebsd) || defined(VGO_openbsd)
>> + #define VG_MEMALIGN_MAKE_SIZE_MULTIPLE_ALIGN 1
>> + #else
>> + #define VG_MEMALIGN_MAKE_SIZE_MULTIPLE_ALIGN 0
>> +@@ -1834,7 +1834,7 @@
>> + MEMALIGN(VG_Z_LIBC_SONAME, memalign);
>> + MEMALIGN(SO_SYN_MALLOC, memalign);
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + MEMALIGN(VG_Z_LIBC_SONAME, memalign);
>> + MEMALIGN(SO_SYN_MALLOC, memalign);
>> +
>> +@@ -1890,7 +1890,7 @@
>> + VALLOC(VG_Z_LIBC_SONAME, valloc);
>> + VALLOC(SO_SYN_MALLOC, valloc);
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + VALLOC(VG_Z_LIBC_SONAME, valloc);
>> + VALLOC(SO_SYN_MALLOC, valloc);
>> +
>> +@@ -2031,7 +2031,7 @@
>> + POSIX_MEMALIGN(VG_Z_LIBC_SONAME, posix_memalign);
>> + POSIX_MEMALIGN(SO_SYN_MALLOC, posix_memalign);
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + POSIX_MEMALIGN(VG_Z_LIBC_SONAME, posix_memalign);
>> + POSIX_MEMALIGN(SO_SYN_MALLOC, posix_memalign);
>> +
>> +@@ -2176,7 +2176,7 @@
>> + ALIGNED_ALLOC(VG_Z_LIBC_SONAME, aligned_alloc);
>> + ALIGNED_ALLOC(SO_SYN_MALLOC, aligned_alloc);
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + ALIGNED_ALLOC(G_Z_LIBC_SONAME, aligned_alloc);
>> + ALIGNED_ALLOC(SO_SYN_MALLOC, aligned_alloc);
>> +
>> +@@ -2220,7 +2220,7 @@
>> + MALLOC_USABLE_SIZE(SO_SYN_MALLOC, dlmalloc_usable_size);
>> + # endif
>> +
>> +-#elif defined(VGO_freebsd)
>> ++#elif defined(VGO_freebsd) || defined(VGO_openbsd)
>> + MALLOC_USABLE_SIZE(VG_Z_LIBC_SONAME, malloc_usable_size);
>> + MALLOC_USABLE_SIZE(SO_SYN_MALLOC, malloc_usable_size);
>> +
>>
>