<div dir="ltr">Yes, this should theoretically help against false negatives. Also, ASan does the same.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jun 25, 2013 at 6:28 PM, Dmitry Vyukov <span dir="ltr"><<a href="mailto:dvyukov@google.com" target="_blank">dvyukov@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Tue, Jun 25, 2013 at 6:05 PM, Sergey Matveev <<a href="mailto:earthdok@google.com">earthdok@google.com</a>> wrote:<br>

> Author: smatveev<br>
> Date: Tue Jun 25 09:05:52 2013<br>
> New Revision: 184849<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=184849&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=184849&view=rev</a><br>
> Log:<br>
> [lsan] Define interceptors more correctly. Also, always clear allocated memory.<br>
><br>
> Modified:<br>
>     compiler-rt/trunk/lib/lsan/lsan_interceptors.cc<br>
><br>
> Modified: compiler-rt/trunk/lib/lsan/lsan_interceptors.cc<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_interceptors.cc?rev=184849&r1=184848&r2=184849&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_interceptors.cc?rev=184849&r1=184848&r2=184849&view=diff</a><br>

> ==============================================================================<br>
> --- compiler-rt/trunk/lib/lsan/lsan_interceptors.cc (original)<br>
> +++ compiler-rt/trunk/lib/lsan/lsan_interceptors.cc Tue Jun 25 09:05:52 2013<br>
> @@ -51,6 +51,8 @@ int pthread_setspecific(unsigned key, co<br>
><br>
>  ///// Malloc/free interceptors. /////<br>
><br>
> +const bool kAlwaysClearMemory = true;<br>
> +<br>
>  namespace std {<br>
>    struct nothrow_t;<br>
>  }<br>
> @@ -58,7 +60,7 @@ namespace std {<br>
>  INTERCEPTOR(void*, malloc, uptr size) {<br>
>    Init();<br>
>    GET_STACK_TRACE;<br>
> -  return Allocate(stack, size, 1, false);<br>
> +  return Allocate(stack, size, 1, kAlwaysClearMemory);<br>
<br>
</div></div>Do I read this correctly that malloc() now clears memory?<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
>  }<br>
><br>
>  INTERCEPTOR(void, free, void *p) {<br>
> @@ -83,13 +85,13 @@ INTERCEPTOR(void*, realloc, void *q, upt<br>
>  INTERCEPTOR(void*, memalign, uptr alignment, uptr size) {<br>
>    Init();<br>
>    GET_STACK_TRACE;<br>
> -  return Allocate(stack, size, alignment, false);<br>
> +  return Allocate(stack, size, alignment, kAlwaysClearMemory);<br>
>  }<br>
><br>
>  INTERCEPTOR(int, posix_memalign, void **memptr, uptr alignment, uptr size) {<br>
>    Init();<br>
>    GET_STACK_TRACE;<br>
> -  *memptr = Allocate(stack, size, alignment, false);<br>
> +  *memptr = Allocate(stack, size, alignment, kAlwaysClearMemory);<br>
>    // FIXME: Return ENOMEM if user requested more than max alloc size.<br>
>    return 0;<br>
>  }<br>
> @@ -99,7 +101,7 @@ INTERCEPTOR(void*, valloc, uptr size) {<br>
>    GET_STACK_TRACE;<br>
>    if (size == 0)<br>
>      size = GetPageSizeCached();<br>
> -  return Allocate(stack, size, GetPageSizeCached(), false);<br>
> +  return Allocate(stack, size, GetPageSizeCached(), kAlwaysClearMemory);<br>
>  }<br>
><br>
>  INTERCEPTOR(uptr, malloc_usable_size, void *ptr) {<br>
> @@ -121,28 +123,52 @@ INTERCEPTOR(int, mallopt, int cmd, int v<br>
>    return -1;<br>
>  }<br>
><br>
> -void *operator new(uptr size) ALIAS("malloc") SANITIZER_INTERFACE_ATTRIBUTE;<br>
> -void *operator new[](uptr size) ALIAS("malloc") SANITIZER_INTERFACE_ATTRIBUTE;<br>
> -void *operator new(uptr size, std::nothrow_t const&) ALIAS("malloc")<br>
> -    SANITIZER_INTERFACE_ATTRIBUTE;<br>
> -void *operator new[](uptr size, std::nothrow_t const&) ALIAS("malloc")<br>
> -    SANITIZER_INTERFACE_ATTRIBUTE;<br>
> -void operator delete(void *ptr) ALIAS("free") SANITIZER_INTERFACE_ATTRIBUTE;<br>
> -void operator delete[](void *ptr) ALIAS("free") SANITIZER_INTERFACE_ATTRIBUTE;<br>
> -void operator delete(void *ptr, std::nothrow_t const&) ALIAS("free")<br>
> -    SANITIZER_INTERFACE_ATTRIBUTE;<br>
> -void operator delete[](void *ptr, std::nothrow_t const&) ALIAS("free")<br>
> -    SANITIZER_INTERFACE_ATTRIBUTE;<br>
> -<br>
> -extern "C" {<br>
> -void cfree(void *p) ALIAS("free") SANITIZER_INTERFACE_ATTRIBUTE;<br>
> -void *pvalloc(uptr size) ALIAS("valloc")<br>
> -    SANITIZER_INTERFACE_ATTRIBUTE;<br>
> +INTERCEPTOR(void*, pvalloc, uptr size) {<br>
> +  Init();<br>
> +  GET_STACK_TRACE;<br>
> +  uptr PageSize = GetPageSizeCached();<br>
> +  size = RoundUpTo(size, PageSize);<br>
> +  if (size == 0) {<br>
> +    // pvalloc(0) should allocate one page.<br>
> +    size = PageSize;<br>
> +  }<br>
> +  return Allocate(stack, size, GetPageSizeCached(), kAlwaysClearMemory);<br>
> +}<br>
> +<br>
> +INTERCEPTOR(void, cfree, void *p) ALIAS("free");<br>
> +<br>
> +#define OPERATOR_NEW_BODY                              \<br>
> +  Init();                                              \<br>
> +  GET_STACK_TRACE;                                     \<br>
> +  return Allocate(stack, size, 1, kAlwaysClearMemory);<br>
> +<br>
> +INTERCEPTOR_ATTRIBUTE<br>
> +void *operator new(uptr size) { OPERATOR_NEW_BODY; }<br>
> +INTERCEPTOR_ATTRIBUTE<br>
> +void *operator new[](uptr size) { OPERATOR_NEW_BODY; }<br>
> +INTERCEPTOR_ATTRIBUTE<br>
> +void *operator new(uptr size, std::nothrow_t const&) { OPERATOR_NEW_BODY; }<br>
> +INTERCEPTOR_ATTRIBUTE<br>
> +void *operator new[](uptr size, std::nothrow_t const&) { OPERATOR_NEW_BODY; }<br>
> +<br>
> +#define OPERATOR_DELETE_BODY \<br>
> +  Init();                    \<br>
> +  Deallocate(ptr);<br>
> +<br>
> +INTERCEPTOR_ATTRIBUTE<br>
> +void operator delete(void *ptr) { OPERATOR_DELETE_BODY; }<br>
> +INTERCEPTOR_ATTRIBUTE<br>
> +void operator delete[](void *ptr) { OPERATOR_DELETE_BODY; }<br>
> +INTERCEPTOR_ATTRIBUTE<br>
> +void operator delete(void *ptr, std::nothrow_t const&) { OPERATOR_DELETE_BODY; }<br>
> +INTERCEPTOR_ATTRIBUTE<br>
> +void operator delete[](void *ptr, std::nothrow_t const &) {<br>
> +  OPERATOR_DELETE_BODY;<br>
> +}<br>
> +<br>
>  // We need this to intercept the __libc_memalign calls that are used to<br>
>  // allocate dynamic TLS space in ld-linux.so.<br>
> -void *__libc_memalign(uptr alignment, uptr size)<br>
> -    ALIAS("memalign") SANITIZER_INTERFACE_ATTRIBUTE;<br>
> -}<br>
> +INTERCEPTOR(void *, __libc_memalign, uptr align, uptr s) ALIAS("memalign");<br>
><br>
>  ///// Thread initialization and finalization. /////<br>
><br>
> @@ -231,12 +257,14 @@ namespace __lsan {<br>
>  void InitializeInterceptors() {<br>
>    INTERCEPT_FUNCTION(malloc);<br>
>    INTERCEPT_FUNCTION(free);<br>
> +  INTERCEPT_FUNCTION(cfree);<br>
>    INTERCEPT_FUNCTION(calloc);<br>
>    INTERCEPT_FUNCTION(realloc);<br>
>    INTERCEPT_FUNCTION(memalign);<br>
>    INTERCEPT_FUNCTION(posix_memalign);<br>
> -  INTERCEPT_FUNCTION(memalign);<br>
> +  INTERCEPT_FUNCTION(__libc_memalign);<br>
>    INTERCEPT_FUNCTION(valloc);<br>
> +  INTERCEPT_FUNCTION(pvalloc);<br>
>    INTERCEPT_FUNCTION(malloc_usable_size);<br>
>    INTERCEPT_FUNCTION(mallinfo);<br>
>    INTERCEPT_FUNCTION(mallopt);<br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br></div>