[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