xref: /llvm-project/compiler-rt/test/sanitizer_common/TestCases/Darwin/malloc_zone.cpp (revision 5ef4b190d9910fa6bfbd7406ea6629b53e4e8d79)
1*5ef4b190SJulian Lettner // Check that malloc_default_zone and malloc_zone_from_ptr return the
2*5ef4b190SJulian Lettner // sanitizer-installed malloc zone even when MallocStackLogging (MSL) is
3*5ef4b190SJulian Lettner // requested. This prevents crashes in certain situations. Note that the
4*5ef4b190SJulian Lettner // sanitizers and MSL cannot be used together. If both are enabled, MSL
5*5ef4b190SJulian Lettner // functionality is essentially deactivated since it only hooks the default
6*5ef4b190SJulian Lettner // allocator which is replaced by a custom sanitizer allocator.
7*5ef4b190SJulian Lettner //
8*5ef4b190SJulian Lettner // MSL=lite creates its own special malloc zone, copies the passed zone name,
9*5ef4b190SJulian Lettner // and leaks it.
10*5ef4b190SJulian Lettner // RUN: echo "leak:create_and_insert_msl_lite_zone" >> lsan.supp
11*5ef4b190SJulian Lettner //
12*5ef4b190SJulian Lettner // RUN: %clangxx -g %s -o %t
13*5ef4b190SJulian Lettner // RUN:                                                                   %run %t | FileCheck %s
14*5ef4b190SJulian Lettner // RUN: %env MallocStackLogging=lite LSAN_OPTIONS=suppressions=lsan.supp  %run %t | FileCheck %s
15*5ef4b190SJulian Lettner // RUN: %env MallocStackLogging=full                                      %run %t | FileCheck %s
16*5ef4b190SJulian Lettner //
17*5ef4b190SJulian Lettner // UBSan does not install a malloc zone.
18*5ef4b190SJulian Lettner // XFAIL: ubsan
19*5ef4b190SJulian Lettner //
20*5ef4b190SJulian Lettner 
21*5ef4b190SJulian Lettner #include <malloc/malloc.h>
22*5ef4b190SJulian Lettner #include <stdlib.h>
23*5ef4b190SJulian Lettner #include <stdio.h>
24*5ef4b190SJulian Lettner 
main(void)25*5ef4b190SJulian Lettner int main(void) {
26*5ef4b190SJulian Lettner   malloc_zone_t *default_zone = malloc_default_zone();
27*5ef4b190SJulian Lettner   printf("default zone name: %s\n", malloc_get_zone_name(default_zone));
28*5ef4b190SJulian Lettner // CHECK: default zone name: {{a|l|t}}san
29*5ef4b190SJulian Lettner 
30*5ef4b190SJulian Lettner   void *ptr1 = malloc(10);
31*5ef4b190SJulian Lettner   void *ptr2 = malloc_zone_malloc(default_zone, 10);
32*5ef4b190SJulian Lettner 
33*5ef4b190SJulian Lettner   malloc_zone_t* zone1 = malloc_zone_from_ptr(ptr1);
34*5ef4b190SJulian Lettner   malloc_zone_t* zone2 = malloc_zone_from_ptr(ptr2);
35*5ef4b190SJulian Lettner 
36*5ef4b190SJulian Lettner   printf("zone1: %d\n", zone1 == default_zone);
37*5ef4b190SJulian Lettner   printf("zone2: %d\n", zone2 == default_zone);
38*5ef4b190SJulian Lettner // CHECK: zone1: 1
39*5ef4b190SJulian Lettner // CHECK: zone2: 1
40*5ef4b190SJulian Lettner 
41*5ef4b190SJulian Lettner   free(ptr1);
42*5ef4b190SJulian Lettner   malloc_zone_free(zone2, ptr2);
43*5ef4b190SJulian Lettner 
44*5ef4b190SJulian Lettner   return 0;
45*5ef4b190SJulian Lettner }
46