| // Check that free hook doesn't conflict with Realloc. |
| // RUN: %clangxx_asan -O2 %s -o %t |
| // RUN: %run %t 2>&1 | FileCheck %s |
| |
| // FIXME: merge this with the common free_hook_realloc test when we can run |
| // common tests on Windows. |
| |
| // FIXME: Doesn't work with DLLs |
| // XFAIL: win32-dynamic-asan |
| |
| #include <stdlib.h> |
| #include <io.h> |
| #include <sanitizer/allocator_interface.h> |
| |
| static void *glob_ptr; |
| |
| extern "C" { |
| void __sanitizer_free_hook(const volatile void *ptr) { |
| if (ptr == glob_ptr) { |
| *(int*)ptr = 0; |
| write(1, "FreeHook\n", sizeof("FreeHook\n")); |
| } |
| } |
| } |
| |
| int main() { |
| int *x = (int*)malloc(100); |
| x[0] = 42; |
| glob_ptr = x; |
| int *y = (int*)realloc(x, 200); |
| // Verify that free hook was called and didn't spoil the memory. |
| if (y[0] != 42) { |
| _exit(1); |
| } |
| write(1, "Passed\n", sizeof("Passed\n")); |
| free(y); |
| // CHECK: FreeHook |
| // CHECK: Passed |
| return 0; |
| } |