1 | // Test that malloc_zone_from_ptr returns a valid zone for a 0-sized allocation. |
2 | // Test that malloc_size does not crash for an invalid pointer. |
3 | |
4 | // RUN: %clang_tsan %s -o %t -framework Foundation |
5 | // RUN: %run %t 2>&1 | FileCheck %s |
6 | |
7 | #include <malloc/malloc.h> |
8 | #include <stdio.h> |
9 | #include <stdlib.h> |
10 | #include <sys/mman.h> |
11 | |
12 | int some_global; |
13 | |
14 | void describe_zone(void *p) { |
15 | malloc_zone_t *z = malloc_zone_from_ptr(p); |
16 | if (z) { |
17 | fprintf(stderr, "zone = %p\n" , z); |
18 | } else { |
19 | fprintf(stderr, format: "zone = no zone\n" ); |
20 | } |
21 | } |
22 | |
23 | int main() { |
24 | void *p; |
25 | size_t s; |
26 | |
27 | p = malloc(size: 0x40); |
28 | s = malloc_size(p); |
29 | fprintf(stderr, format: "size = 0x%zx\n" , s); |
30 | // CHECK: size = 0x40 |
31 | describe_zone(p); |
32 | // CHECK: zone = 0x{{[0-9a-f]+}} |
33 | |
34 | p = malloc(size: 0); |
35 | s = malloc_size(p); |
36 | fprintf(stderr, format: "size = 0x%zx\n" , s); |
37 | // CHECK: size = 0x1 |
38 | describe_zone(p); |
39 | // CHECK: zone = 0x{{[0-9a-f]+}} |
40 | |
41 | p = &some_global; |
42 | s = malloc_size(p); |
43 | fprintf(stderr, format: "size = 0x%zx\n" , s); |
44 | // CHECK: size = 0x0 |
45 | describe_zone(p); |
46 | // CHECK: zone = no zone |
47 | |
48 | p = mmap(addr: 0, len: 0x1000, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, fd: -1, offset: 0); |
49 | if (!p) { |
50 | fprintf(stderr, format: "mmap failed\n" ); |
51 | exit(status: 1); |
52 | } |
53 | s = malloc_size(p); |
54 | fprintf(stderr, format: "size = 0x%zx\n" , s); |
55 | // CHECK: size = 0x0 |
56 | describe_zone(p); |
57 | // CHECK: zone = no zone |
58 | |
59 | p = (void *)0x42; // invalid pointer |
60 | s = malloc_size(p); |
61 | fprintf(stderr, format: "size = 0x%zx\n" , s); |
62 | // CHECK: size = 0x0 |
63 | describe_zone(p); |
64 | // CHECK: zone = no zone |
65 | |
66 | return 0; |
67 | } |
68 | |