68 lines · plain
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 Foundation5// RUN: %run %t 2>&1 | FileCheck %s6 7#include <malloc/malloc.h>8#include <stdio.h>9#include <stdlib.h>10#include <sys/mman.h>11 12int some_global;13 14void 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, "zone = no zone\n");20 }21}22 23int main() {24 void *p;25 size_t s;26 27 p = malloc(0x40);28 s = malloc_size(p);29 fprintf(stderr, "size = 0x%zx\n", s);30 // CHECK: size = 0x4031 describe_zone(p);32 // CHECK: zone = 0x{{[0-9a-f]+}}33 34 p = malloc(0);35 s = malloc_size(p);36 fprintf(stderr, "size = 0x%zx\n", s);37 // CHECK: size = 0x138 describe_zone(p);39 // CHECK: zone = 0x{{[0-9a-f]+}}40 41 p = &some_global;42 s = malloc_size(p);43 fprintf(stderr, "size = 0x%zx\n", s);44 // CHECK: size = 0x045 describe_zone(p);46 // CHECK: zone = no zone47 48 p = mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);49 if (!p) {50 fprintf(stderr, "mmap failed\n");51 exit(1);52 }53 s = malloc_size(p);54 fprintf(stderr, "size = 0x%zx\n", s);55 // CHECK: size = 0x056 describe_zone(p);57 // CHECK: zone = no zone58 59 p = (void *)0x42; // invalid pointer60 s = malloc_size(p);61 fprintf(stderr, "size = 0x%zx\n", s);62 // CHECK: size = 0x063 describe_zone(p);64 // CHECK: zone = no zone65 66 return 0;67}68