// Test for mmap/munmap interceptors. // RUN: %clang_asan %s -o %t // RUN: %run %t 2>&1 #include #include #include #include #include int main(int argc, char **argv) { int size = 4096; int val = 42; // Get any mmaped pointer. void *r = mmap(0, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); assert(r != MAP_FAILED); // Make sure the memory is unpoisoned. if (__asan_region_is_poisoned(r, size) != 0) { fprintf(stderr, "Memory returned by mmap should be unpoisoned.\n"); abort(); } // First munmmap and then mmap the same pointer using MAP_FIXED. __asan_poison_memory_region(r, size); munmap(r, size); if (__asan_region_is_poisoned(r, size) != 0) { fprintf(stderr, "Shadow memory was not cleaned by munmap.\n"); abort(); } __asan_poison_memory_region(r, size); void *p = mmap(r, size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); assert(r == p); // Make sure the memory is unpoisoned. if (__asan_region_is_poisoned(r, size) != 0) { fprintf(stderr, "Memory returned by mmap should be unpoisoned.\n"); abort(); } return 0; }