[compiler-rt] r184849 - [lsan] Define interceptors more correctly. Also, always clear allocated memory.

Dmitry Vyukov dvyukov at google.com
Tue Jun 25 07:28:59 PDT 2013


On Tue, Jun 25, 2013 at 6:05 PM, Sergey Matveev <earthdok at google.com> wrote:
> Author: smatveev
> Date: Tue Jun 25 09:05:52 2013
> New Revision: 184849
>
> URL: http://llvm.org/viewvc/llvm-project?rev=184849&view=rev
> Log:
> [lsan] Define interceptors more correctly. Also, always clear allocated memory.
>
> Modified:
>     compiler-rt/trunk/lib/lsan/lsan_interceptors.cc
>
> Modified: compiler-rt/trunk/lib/lsan/lsan_interceptors.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_interceptors.cc?rev=184849&r1=184848&r2=184849&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/lsan/lsan_interceptors.cc (original)
> +++ compiler-rt/trunk/lib/lsan/lsan_interceptors.cc Tue Jun 25 09:05:52 2013
> @@ -51,6 +51,8 @@ int pthread_setspecific(unsigned key, co
>
>  ///// Malloc/free interceptors. /////
>
> +const bool kAlwaysClearMemory = true;
> +
>  namespace std {
>    struct nothrow_t;
>  }
> @@ -58,7 +60,7 @@ namespace std {
>  INTERCEPTOR(void*, malloc, uptr size) {
>    Init();
>    GET_STACK_TRACE;
> -  return Allocate(stack, size, 1, false);
> +  return Allocate(stack, size, 1, kAlwaysClearMemory);

Do I read this correctly that malloc() now clears memory?


>  }
>
>  INTERCEPTOR(void, free, void *p) {
> @@ -83,13 +85,13 @@ INTERCEPTOR(void*, realloc, void *q, upt
>  INTERCEPTOR(void*, memalign, uptr alignment, uptr size) {
>    Init();
>    GET_STACK_TRACE;
> -  return Allocate(stack, size, alignment, false);
> +  return Allocate(stack, size, alignment, kAlwaysClearMemory);
>  }
>
>  INTERCEPTOR(int, posix_memalign, void **memptr, uptr alignment, uptr size) {
>    Init();
>    GET_STACK_TRACE;
> -  *memptr = Allocate(stack, size, alignment, false);
> +  *memptr = Allocate(stack, size, alignment, kAlwaysClearMemory);
>    // FIXME: Return ENOMEM if user requested more than max alloc size.
>    return 0;
>  }
> @@ -99,7 +101,7 @@ INTERCEPTOR(void*, valloc, uptr size) {
>    GET_STACK_TRACE;
>    if (size == 0)
>      size = GetPageSizeCached();
> -  return Allocate(stack, size, GetPageSizeCached(), false);
> +  return Allocate(stack, size, GetPageSizeCached(), kAlwaysClearMemory);
>  }
>
>  INTERCEPTOR(uptr, malloc_usable_size, void *ptr) {
> @@ -121,28 +123,52 @@ INTERCEPTOR(int, mallopt, int cmd, int v
>    return -1;
>  }
>
> -void *operator new(uptr size) ALIAS("malloc") SANITIZER_INTERFACE_ATTRIBUTE;
> -void *operator new[](uptr size) ALIAS("malloc") SANITIZER_INTERFACE_ATTRIBUTE;
> -void *operator new(uptr size, std::nothrow_t const&) ALIAS("malloc")
> -    SANITIZER_INTERFACE_ATTRIBUTE;
> -void *operator new[](uptr size, std::nothrow_t const&) ALIAS("malloc")
> -    SANITIZER_INTERFACE_ATTRIBUTE;
> -void operator delete(void *ptr) ALIAS("free") SANITIZER_INTERFACE_ATTRIBUTE;
> -void operator delete[](void *ptr) ALIAS("free") SANITIZER_INTERFACE_ATTRIBUTE;
> -void operator delete(void *ptr, std::nothrow_t const&) ALIAS("free")
> -    SANITIZER_INTERFACE_ATTRIBUTE;
> -void operator delete[](void *ptr, std::nothrow_t const&) ALIAS("free")
> -    SANITIZER_INTERFACE_ATTRIBUTE;
> -
> -extern "C" {
> -void cfree(void *p) ALIAS("free") SANITIZER_INTERFACE_ATTRIBUTE;
> -void *pvalloc(uptr size) ALIAS("valloc")
> -    SANITIZER_INTERFACE_ATTRIBUTE;
> +INTERCEPTOR(void*, pvalloc, uptr size) {
> +  Init();
> +  GET_STACK_TRACE;
> +  uptr PageSize = GetPageSizeCached();
> +  size = RoundUpTo(size, PageSize);
> +  if (size == 0) {
> +    // pvalloc(0) should allocate one page.
> +    size = PageSize;
> +  }
> +  return Allocate(stack, size, GetPageSizeCached(), kAlwaysClearMemory);
> +}
> +
> +INTERCEPTOR(void, cfree, void *p) ALIAS("free");
> +
> +#define OPERATOR_NEW_BODY                              \
> +  Init();                                              \
> +  GET_STACK_TRACE;                                     \
> +  return Allocate(stack, size, 1, kAlwaysClearMemory);
> +
> +INTERCEPTOR_ATTRIBUTE
> +void *operator new(uptr size) { OPERATOR_NEW_BODY; }
> +INTERCEPTOR_ATTRIBUTE
> +void *operator new[](uptr size) { OPERATOR_NEW_BODY; }
> +INTERCEPTOR_ATTRIBUTE
> +void *operator new(uptr size, std::nothrow_t const&) { OPERATOR_NEW_BODY; }
> +INTERCEPTOR_ATTRIBUTE
> +void *operator new[](uptr size, std::nothrow_t const&) { OPERATOR_NEW_BODY; }
> +
> +#define OPERATOR_DELETE_BODY \
> +  Init();                    \
> +  Deallocate(ptr);
> +
> +INTERCEPTOR_ATTRIBUTE
> +void operator delete(void *ptr) { OPERATOR_DELETE_BODY; }
> +INTERCEPTOR_ATTRIBUTE
> +void operator delete[](void *ptr) { OPERATOR_DELETE_BODY; }
> +INTERCEPTOR_ATTRIBUTE
> +void operator delete(void *ptr, std::nothrow_t const&) { OPERATOR_DELETE_BODY; }
> +INTERCEPTOR_ATTRIBUTE
> +void operator delete[](void *ptr, std::nothrow_t const &) {
> +  OPERATOR_DELETE_BODY;
> +}
> +
>  // We need this to intercept the __libc_memalign calls that are used to
>  // allocate dynamic TLS space in ld-linux.so.
> -void *__libc_memalign(uptr alignment, uptr size)
> -    ALIAS("memalign") SANITIZER_INTERFACE_ATTRIBUTE;
> -}
> +INTERCEPTOR(void *, __libc_memalign, uptr align, uptr s) ALIAS("memalign");
>
>  ///// Thread initialization and finalization. /////
>
> @@ -231,12 +257,14 @@ namespace __lsan {
>  void InitializeInterceptors() {
>    INTERCEPT_FUNCTION(malloc);
>    INTERCEPT_FUNCTION(free);
> +  INTERCEPT_FUNCTION(cfree);
>    INTERCEPT_FUNCTION(calloc);
>    INTERCEPT_FUNCTION(realloc);
>    INTERCEPT_FUNCTION(memalign);
>    INTERCEPT_FUNCTION(posix_memalign);
> -  INTERCEPT_FUNCTION(memalign);
> +  INTERCEPT_FUNCTION(__libc_memalign);
>    INTERCEPT_FUNCTION(valloc);
> +  INTERCEPT_FUNCTION(pvalloc);
>    INTERCEPT_FUNCTION(malloc_usable_size);
>    INTERCEPT_FUNCTION(mallinfo);
>    INTERCEPT_FUNCTION(mallopt);
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list