| // Test that malloc_zone_from_ptr returns a valid zone for a 0-sized allocation. |
| |
| // RUN: %clang_tsan %s -o %t -framework Foundation |
| // RUN: %run %t 2>&1 | FileCheck %s |
| |
| #include <malloc/malloc.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <sys/mman.h> |
| |
| int some_global; |
| |
| void describe_zone(void *p) { |
| malloc_zone_t *z = malloc_zone_from_ptr(p); |
| if (z) { |
| fprintf(stderr, "zone = %p\n", z); |
| } else { |
| fprintf(stderr, "zone = no zone\n"); |
| } |
| } |
| |
| int main() { |
| void *p; |
| size_t s; |
| |
| p = malloc(0x40); |
| s = malloc_size(p); |
| fprintf(stderr, "size = 0x%zx\n", s); |
| // CHECK: size = 0x40 |
| describe_zone(p); |
| // CHECK: zone = 0x{{[0-9a-f]+}} |
| |
| p = malloc(0); |
| s = malloc_size(p); |
| fprintf(stderr, "size = 0x%zx\n", s); |
| // CHECK: size = 0x1 |
| describe_zone(p); |
| // CHECK: zone = 0x{{[0-9a-f]+}} |
| |
| p = &some_global; |
| s = malloc_size(p); |
| fprintf(stderr, "size = 0x%zx\n", s); |
| // CHECK: size = 0x0 |
| describe_zone(p); |
| // CHECK: zone = no zone |
| |
| p = mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0); |
| if (!p) { |
| fprintf(stderr, "mmap failed\n"); |
| exit(1); |
| } |
| s = malloc_size(p); |
| fprintf(stderr, "size = 0x%zx\n", s); |
| // CHECK: size = 0x0 |
| describe_zone(p); |
| // CHECK: zone = no zone |
| } |