[llvm-commits] [compiler-rt] r162355 - in /compiler-rt/trunk/lib/asan: asan_allocator.cc asan_interface.h asan_rtl.cc lit_tests/malloc_hook.cc

Anna Zaks ganna at apple.com
Mon Aug 27 11:20:09 PDT 2012


Alexey,

I am curious what is the motivation/use case for these callbacks. I guess it would allow a mechanism for extra data collection..

Thanks,
Anna.
On Aug 22, 2012, at 3:12 AM, Alexey Samsonov wrote:

> Author: samsonov
> Date: Wed Aug 22 05:12:47 2012
> New Revision: 162355
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=162355&view=rev
> Log:
> [ASan] make ASan malloc/free hooks weak interface functions, overridable by user. Now the user can control malloc/free hooks without recompiling ASan runtime
> 
> Added:
>    compiler-rt/trunk/lib/asan/lit_tests/malloc_hook.cc
> Modified:
>    compiler-rt/trunk/lib/asan/asan_allocator.cc
>    compiler-rt/trunk/lib/asan/asan_interface.h
>    compiler-rt/trunk/lib/asan/asan_rtl.cc
> 
> Modified: compiler-rt/trunk/lib/asan/asan_allocator.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_allocator.cc?rev=162355&r1=162354&r2=162355&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/asan/asan_allocator.cc (original)
> +++ compiler-rt/trunk/lib/asan/asan_allocator.cc Wed Aug 22 05:12:47 2012
> @@ -788,45 +788,38 @@
> 
> }  // namespace __asan
> 
> -// Malloc hooks declaration.
> -// ASAN_NEW_HOOK(ptr, size) is called immediately after
> -//   allocation of "size" bytes, which returned "ptr".
> -// ASAN_DELETE_HOOK(ptr) is called immediately before
> -//   deallocation of "ptr".
> -// If ASAN_NEW_HOOK or ASAN_DELETE_HOOK is defined, user
> -// program must provide implementation of this hook.
> -// If macro is undefined, the hook is no-op.
> -#ifdef ASAN_NEW_HOOK
> -extern "C" void ASAN_NEW_HOOK(void *ptr, uptr size);
> -#else
> -static inline void ASAN_NEW_HOOK(void *ptr, uptr size) { }
> -#endif
> -
> -#ifdef ASAN_DELETE_HOOK
> -extern "C" void ASAN_DELETE_HOOK(void *ptr);
> -#else
> -static inline void ASAN_DELETE_HOOK(void *ptr) { }
> -#endif
> +// Default (no-op) implementation of malloc hooks.
> +extern "C" {
> +SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE
> +void __asan_malloc_hook(void *ptr, uptr size) {
> +  (void)ptr;
> +  (void)size;
> +}
> +SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE
> +void __asan_free_hook(void *ptr) {
> +  (void)ptr;
> +}
> +}  // extern "C"
> 
> namespace __asan {
> 
> SANITIZER_INTERFACE_ATTRIBUTE
> void *asan_memalign(uptr alignment, uptr size, AsanStackTrace *stack) {
>   void *ptr = (void*)Allocate(alignment, size, stack);
> -  ASAN_NEW_HOOK(ptr, size);
> +  __asan_malloc_hook(ptr, size);
>   return ptr;
> }
> 
> SANITIZER_INTERFACE_ATTRIBUTE
> void asan_free(void *ptr, AsanStackTrace *stack) {
> -  ASAN_DELETE_HOOK(ptr);
> +  __asan_free_hook(ptr);
>   Deallocate((u8*)ptr, stack);
> }
> 
> SANITIZER_INTERFACE_ATTRIBUTE
> void *asan_malloc(uptr size, AsanStackTrace *stack) {
>   void *ptr = (void*)Allocate(0, size, stack);
> -  ASAN_NEW_HOOK(ptr, size);
> +  __asan_malloc_hook(ptr, size);
>   return ptr;
> }
> 
> @@ -834,17 +827,17 @@
>   void *ptr = (void*)Allocate(0, nmemb * size, stack);
>   if (ptr)
>     REAL(memset)(ptr, 0, nmemb * size);
> -  ASAN_NEW_HOOK(ptr, nmemb * size);
> +  __asan_malloc_hook(ptr, nmemb * size);
>   return ptr;
> }
> 
> void *asan_realloc(void *p, uptr size, AsanStackTrace *stack) {
>   if (p == 0) {
>     void *ptr = (void*)Allocate(0, size, stack);
> -    ASAN_NEW_HOOK(ptr, size);
> +    __asan_malloc_hook(ptr, size);
>     return ptr;
>   } else if (size == 0) {
> -    ASAN_DELETE_HOOK(p);
> +    __asan_free_hook(p);
>     Deallocate((u8*)p, stack);
>     return 0;
>   }
> @@ -853,7 +846,7 @@
> 
> void *asan_valloc(uptr size, AsanStackTrace *stack) {
>   void *ptr = (void*)Allocate(kPageSize, size, stack);
> -  ASAN_NEW_HOOK(ptr, size);
> +  __asan_malloc_hook(ptr, size);
>   return ptr;
> }
> 
> @@ -864,7 +857,7 @@
>     size = kPageSize;
>   }
>   void *ptr = (void*)Allocate(kPageSize, size, stack);
> -  ASAN_NEW_HOOK(ptr, size);
> +  __asan_malloc_hook(ptr, size);
>   return ptr;
> }
> 
> @@ -872,7 +865,7 @@
>                           AsanStackTrace *stack) {
>   void *ptr = Allocate(alignment, size, stack);
>   CHECK(IsAligned((uptr)ptr, alignment));
> -  ASAN_NEW_HOOK(ptr, size);
> +  __asan_malloc_hook(ptr, size);
>   *memptr = ptr;
>   return 0;
> }
> 
> Modified: compiler-rt/trunk/lib/asan/asan_interface.h
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_interface.h?rev=162355&r1=162354&r2=162355&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/asan/asan_interface.h (original)
> +++ compiler-rt/trunk/lib/asan/asan_interface.h Wed Aug 22 05:12:47 2012
> @@ -175,6 +175,17 @@
>   // ASan runtime options. See asan_flags.h for details.
>   const char* __asan_default_options()
>       SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE;
> +
> +  // Malloc hooks that may be overriden by user.
> +  // __asan_malloc_hook(ptr, size) is called immediately after
> +  //   allocation of "size" bytes, which returned "ptr".
> +  // __asan_free_hook(ptr) is called immediately before
> +  //   deallocation of "ptr".
> +  // If user doesn't provide implementations of these hooks, they are no-op.
> +  void __asan_malloc_hook(void *ptr, uptr size)
> +      SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE;
> +  void __asan_free_hook(void *ptr)
> +      SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE;
> }  // extern "C"
> 
> #endif  // ASAN_INTERFACE_H
> 
> Modified: compiler-rt/trunk/lib/asan/asan_rtl.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_rtl.cc?rev=162355&r1=162354&r2=162355&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/asan/asan_rtl.cc (original)
> +++ compiler-rt/trunk/lib/asan/asan_rtl.cc Wed Aug 22 05:12:47 2012
> @@ -250,6 +250,8 @@
>     case 31: __asan_default_options(); break;
>     case 32: __asan_before_dynamic_init(0, 0); break;
>     case 33: __asan_after_dynamic_init(); break;
> +    case 34: __asan_malloc_hook(0, 0); break;
> +    case 35: __asan_free_hook(0); break;
>   }
> }
> 
> 
> Added: compiler-rt/trunk/lib/asan/lit_tests/malloc_hook.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/lit_tests/malloc_hook.cc?rev=162355&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/asan/lit_tests/malloc_hook.cc (added)
> +++ compiler-rt/trunk/lib/asan/lit_tests/malloc_hook.cc Wed Aug 22 05:12:47 2012
> @@ -0,0 +1,20 @@
> +// RUN: %clangxx_asan -O2 %s -o %t
> +// RUN: %t 2>&1 | FileCheck %s
> +#include <stdio.h>
> +#include <stdlib.h>
> +
> +extern "C" {
> +// Note: avoid calling functions that allocate memory in malloc/free
> +// to avoid infinite recursion.
> +void __asan_malloc_hook(void *ptr, size_t sz) { puts("MallocHook"); }
> +void __asan_free_hook(void *ptr) {  puts("FreeHook"); }
> +}  // extern "C"
> +
> +int main() {
> +  volatile int *x = new int;
> +  // CHECK: MallocHook
> +  *x = 0;
> +  delete x;
> +  // CHECK: FreeHook
> +  return 0;
> +}
> 
> 
> _______________________________________________
> 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