On Tue, Sep 05, 2023 at 03:00:12PM +0900, Masato Asou wrote:

> From: Otto Moerbeek <o...@drijf.net>
> 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?

Here it is:

#include <stdlib.h>
#include <stdio.h>

int
main(int argc, char *argv[])
{
        size_t sz = atoi(argv[1]);
        unsigned char *p = malloc(sz);
        printf("%p\n", p);
        p[sz] = 0;
        printf("%x\n", p[sz]);
        free(p);
        free(p);
        return 0;
}

> --
> 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);
> >> + 
> >> 
> > 

Reply via email to