annotate libsanitizer/sanitizer_common/sanitizer_malloc_mac.inc @ 143:76e1cf5455ef

add cbc_gc test
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 23 Dec 2018 19:24:05 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 //===-- sanitizer_malloc_mac.inc --------------------------------*- C++ -*-===//
kono
parents:
diff changeset
2 //
kono
parents:
diff changeset
3 // This file is distributed under the University of Illinois Open Source
kono
parents:
diff changeset
4 // License. See LICENSE.TXT for details.
kono
parents:
diff changeset
5 //
kono
parents:
diff changeset
6 //===----------------------------------------------------------------------===//
kono
parents:
diff changeset
7 //
kono
parents:
diff changeset
8 // This file contains Mac-specific malloc interceptors and a custom zone
kono
parents:
diff changeset
9 // implementation, which together replace the system allocator.
kono
parents:
diff changeset
10 //
kono
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13 #include "sanitizer_common/sanitizer_platform.h"
kono
parents:
diff changeset
14 #if !SANITIZER_MAC
kono
parents:
diff changeset
15 #error "This file should only be compiled on Darwin."
kono
parents:
diff changeset
16 #endif
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 #include <AvailabilityMacros.h>
kono
parents:
diff changeset
19 #include <CoreFoundation/CFBase.h>
kono
parents:
diff changeset
20 #include <dlfcn.h>
kono
parents:
diff changeset
21 #include <malloc/malloc.h>
kono
parents:
diff changeset
22 #include <sys/mman.h>
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 #include "interception/interception.h"
kono
parents:
diff changeset
25 #include "sanitizer_common/sanitizer_mac.h"
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 // Similar code is used in Google Perftools,
kono
parents:
diff changeset
28 // https://github.com/gperftools/gperftools.
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 static malloc_zone_t sanitizer_zone;
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 INTERCEPTOR(malloc_zone_t *, malloc_create_zone,
kono
parents:
diff changeset
33 vm_size_t start_size, unsigned zone_flags) {
kono
parents:
diff changeset
34 COMMON_MALLOC_ENTER();
kono
parents:
diff changeset
35 uptr page_size = GetPageSizeCached();
kono
parents:
diff changeset
36 uptr allocated_size = RoundUpTo(sizeof(sanitizer_zone), page_size);
kono
parents:
diff changeset
37 COMMON_MALLOC_MEMALIGN(page_size, allocated_size);
kono
parents:
diff changeset
38 malloc_zone_t *new_zone = (malloc_zone_t *)p;
kono
parents:
diff changeset
39 internal_memcpy(new_zone, &sanitizer_zone, sizeof(sanitizer_zone));
kono
parents:
diff changeset
40 new_zone->zone_name = NULL; // The name will be changed anyway.
kono
parents:
diff changeset
41 if (GetMacosVersion() >= MACOS_VERSION_LION) {
kono
parents:
diff changeset
42 // Prevent the client app from overwriting the zone contents.
kono
parents:
diff changeset
43 // Library functions that need to modify the zone will set PROT_WRITE on it.
kono
parents:
diff changeset
44 // This matches the behavior of malloc_create_zone() on OSX 10.7 and higher.
kono
parents:
diff changeset
45 mprotect(new_zone, allocated_size, PROT_READ);
kono
parents:
diff changeset
46 }
kono
parents:
diff changeset
47 // We're explicitly *NOT* registering the zone.
kono
parents:
diff changeset
48 return new_zone;
kono
parents:
diff changeset
49 }
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 INTERCEPTOR(void, malloc_destroy_zone, malloc_zone_t *zone) {
kono
parents:
diff changeset
52 COMMON_MALLOC_ENTER();
kono
parents:
diff changeset
53 // We don't need to do anything here. We're not registering new zones, so we
kono
parents:
diff changeset
54 // don't to unregister. Just un-mprotect and free() the zone.
kono
parents:
diff changeset
55 if (GetMacosVersion() >= MACOS_VERSION_LION) {
kono
parents:
diff changeset
56 uptr page_size = GetPageSizeCached();
kono
parents:
diff changeset
57 uptr allocated_size = RoundUpTo(sizeof(sanitizer_zone), page_size);
kono
parents:
diff changeset
58 mprotect(zone, allocated_size, PROT_READ | PROT_WRITE);
kono
parents:
diff changeset
59 }
kono
parents:
diff changeset
60 if (zone->zone_name) {
kono
parents:
diff changeset
61 COMMON_MALLOC_FREE((void *)zone->zone_name);
kono
parents:
diff changeset
62 }
kono
parents:
diff changeset
63 COMMON_MALLOC_FREE(zone);
kono
parents:
diff changeset
64 }
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 extern unsigned malloc_num_zones;
kono
parents:
diff changeset
67 extern malloc_zone_t **malloc_zones;
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 // We need to make sure that sanitizer_zone is registered as malloc_zones[0]. If
kono
parents:
diff changeset
70 // libmalloc tries to set up a different zone as malloc_zones[0], it will call
kono
parents:
diff changeset
71 // mprotect(malloc_zones, ..., PROT_READ). This interceptor will catch that and
kono
parents:
diff changeset
72 // make sure we are still the first (default) zone.
kono
parents:
diff changeset
73 INTERCEPTOR(int, mprotect, void *addr, size_t len, int prot) {
kono
parents:
diff changeset
74 if (addr == malloc_zones && prot == PROT_READ) {
kono
parents:
diff changeset
75 if (malloc_num_zones > 1 && malloc_zones[0] != &sanitizer_zone) {
kono
parents:
diff changeset
76 for (unsigned i = 1; i < malloc_num_zones; i++) {
kono
parents:
diff changeset
77 if (malloc_zones[i] == &sanitizer_zone) {
kono
parents:
diff changeset
78 // Swap malloc_zones[0] and malloc_zones[i].
kono
parents:
diff changeset
79 malloc_zones[i] = malloc_zones[0];
kono
parents:
diff changeset
80 malloc_zones[0] = &sanitizer_zone;
kono
parents:
diff changeset
81 break;
kono
parents:
diff changeset
82 }
kono
parents:
diff changeset
83 }
kono
parents:
diff changeset
84 }
kono
parents:
diff changeset
85 }
kono
parents:
diff changeset
86 return REAL(mprotect)(addr, len, prot);
kono
parents:
diff changeset
87 }
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 INTERCEPTOR(malloc_zone_t *, malloc_default_zone, void) {
kono
parents:
diff changeset
90 COMMON_MALLOC_ENTER();
kono
parents:
diff changeset
91 return &sanitizer_zone;
kono
parents:
diff changeset
92 }
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 INTERCEPTOR(malloc_zone_t *, malloc_default_purgeable_zone, void) {
kono
parents:
diff changeset
95 // FIXME: ASan should support purgeable allocations.
kono
parents:
diff changeset
96 // https://github.com/google/sanitizers/issues/139
kono
parents:
diff changeset
97 COMMON_MALLOC_ENTER();
kono
parents:
diff changeset
98 return &sanitizer_zone;
kono
parents:
diff changeset
99 }
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 INTERCEPTOR(void, malloc_make_purgeable, void *ptr) {
kono
parents:
diff changeset
102 // FIXME: ASan should support purgeable allocations. Ignoring them is fine
kono
parents:
diff changeset
103 // for now.
kono
parents:
diff changeset
104 COMMON_MALLOC_ENTER();
kono
parents:
diff changeset
105 }
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 INTERCEPTOR(int, malloc_make_nonpurgeable, void *ptr) {
kono
parents:
diff changeset
108 // FIXME: ASan should support purgeable allocations. Ignoring them is fine
kono
parents:
diff changeset
109 // for now.
kono
parents:
diff changeset
110 COMMON_MALLOC_ENTER();
kono
parents:
diff changeset
111 // Must return 0 if the contents were not purged since the last call to
kono
parents:
diff changeset
112 // malloc_make_purgeable().
kono
parents:
diff changeset
113 return 0;
kono
parents:
diff changeset
114 }
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 INTERCEPTOR(void, malloc_set_zone_name, malloc_zone_t *zone, const char *name) {
kono
parents:
diff changeset
117 COMMON_MALLOC_ENTER();
kono
parents:
diff changeset
118 // Allocate |sizeof(COMMON_MALLOC_ZONE_NAME "-") + internal_strlen(name)|
kono
parents:
diff changeset
119 // bytes.
kono
parents:
diff changeset
120 size_t buflen =
kono
parents:
diff changeset
121 sizeof(COMMON_MALLOC_ZONE_NAME "-") + (name ? internal_strlen(name) : 0);
kono
parents:
diff changeset
122 InternalScopedString new_name(buflen);
kono
parents:
diff changeset
123 if (name && zone->introspect == sanitizer_zone.introspect) {
kono
parents:
diff changeset
124 new_name.append(COMMON_MALLOC_ZONE_NAME "-%s", name);
kono
parents:
diff changeset
125 name = new_name.data();
kono
parents:
diff changeset
126 }
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 // Call the system malloc's implementation for both external and our zones,
kono
parents:
diff changeset
129 // since that appropriately changes VM region protections on the zone.
kono
parents:
diff changeset
130 REAL(malloc_set_zone_name)(zone, name);
kono
parents:
diff changeset
131 }
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 INTERCEPTOR(void *, malloc, size_t size) {
kono
parents:
diff changeset
134 COMMON_MALLOC_ENTER();
kono
parents:
diff changeset
135 COMMON_MALLOC_MALLOC(size);
kono
parents:
diff changeset
136 return p;
kono
parents:
diff changeset
137 }
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 INTERCEPTOR(void, free, void *ptr) {
kono
parents:
diff changeset
140 COMMON_MALLOC_ENTER();
kono
parents:
diff changeset
141 if (!ptr) return;
kono
parents:
diff changeset
142 COMMON_MALLOC_FREE(ptr);
kono
parents:
diff changeset
143 }
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 INTERCEPTOR(void *, realloc, void *ptr, size_t size) {
kono
parents:
diff changeset
146 COMMON_MALLOC_ENTER();
kono
parents:
diff changeset
147 COMMON_MALLOC_REALLOC(ptr, size);
kono
parents:
diff changeset
148 return p;
kono
parents:
diff changeset
149 }
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 INTERCEPTOR(void *, calloc, size_t nmemb, size_t size) {
kono
parents:
diff changeset
152 COMMON_MALLOC_ENTER();
kono
parents:
diff changeset
153 COMMON_MALLOC_CALLOC(nmemb, size);
kono
parents:
diff changeset
154 return p;
kono
parents:
diff changeset
155 }
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 INTERCEPTOR(void *, valloc, size_t size) {
kono
parents:
diff changeset
158 COMMON_MALLOC_ENTER();
kono
parents:
diff changeset
159 COMMON_MALLOC_VALLOC(size);
kono
parents:
diff changeset
160 return p;
kono
parents:
diff changeset
161 }
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 INTERCEPTOR(size_t, malloc_good_size, size_t size) {
kono
parents:
diff changeset
164 COMMON_MALLOC_ENTER();
kono
parents:
diff changeset
165 return sanitizer_zone.introspect->good_size(&sanitizer_zone, size);
kono
parents:
diff changeset
166 }
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 INTERCEPTOR(int, posix_memalign, void **memptr, size_t alignment, size_t size) {
kono
parents:
diff changeset
169 COMMON_MALLOC_ENTER();
kono
parents:
diff changeset
170 CHECK(memptr);
kono
parents:
diff changeset
171 COMMON_MALLOC_MEMALIGN(alignment, size);
kono
parents:
diff changeset
172 if (p) {
kono
parents:
diff changeset
173 *memptr = p;
kono
parents:
diff changeset
174 return 0;
kono
parents:
diff changeset
175 }
kono
parents:
diff changeset
176 return -1;
kono
parents:
diff changeset
177 }
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 namespace {
kono
parents:
diff changeset
180
kono
parents:
diff changeset
181 // TODO(glider): the __sanitizer_mz_* functions should be united with the Linux
kono
parents:
diff changeset
182 // wrappers, as they are basically copied from there.
kono
parents:
diff changeset
183 extern "C"
kono
parents:
diff changeset
184 SANITIZER_INTERFACE_ATTRIBUTE
kono
parents:
diff changeset
185 size_t __sanitizer_mz_size(malloc_zone_t* zone, const void* ptr) {
kono
parents:
diff changeset
186 COMMON_MALLOC_SIZE(ptr);
kono
parents:
diff changeset
187 return size;
kono
parents:
diff changeset
188 }
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190 extern "C"
kono
parents:
diff changeset
191 SANITIZER_INTERFACE_ATTRIBUTE
kono
parents:
diff changeset
192 void *__sanitizer_mz_malloc(malloc_zone_t *zone, uptr size) {
kono
parents:
diff changeset
193 COMMON_MALLOC_ENTER();
kono
parents:
diff changeset
194 COMMON_MALLOC_MALLOC(size);
kono
parents:
diff changeset
195 return p;
kono
parents:
diff changeset
196 }
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 extern "C"
kono
parents:
diff changeset
199 SANITIZER_INTERFACE_ATTRIBUTE
kono
parents:
diff changeset
200 void *__sanitizer_mz_calloc(malloc_zone_t *zone, size_t nmemb, size_t size) {
kono
parents:
diff changeset
201 if (UNLIKELY(!COMMON_MALLOC_SANITIZER_INITIALIZED)) {
kono
parents:
diff changeset
202 // Hack: dlsym calls calloc before REAL(calloc) is retrieved from dlsym.
kono
parents:
diff changeset
203 const size_t kCallocPoolSize = 1024;
kono
parents:
diff changeset
204 static uptr calloc_memory_for_dlsym[kCallocPoolSize];
kono
parents:
diff changeset
205 static size_t allocated;
kono
parents:
diff changeset
206 size_t size_in_words = ((nmemb * size) + kWordSize - 1) / kWordSize;
kono
parents:
diff changeset
207 void *mem = (void*)&calloc_memory_for_dlsym[allocated];
kono
parents:
diff changeset
208 allocated += size_in_words;
kono
parents:
diff changeset
209 CHECK(allocated < kCallocPoolSize);
kono
parents:
diff changeset
210 return mem;
kono
parents:
diff changeset
211 }
kono
parents:
diff changeset
212 COMMON_MALLOC_CALLOC(nmemb, size);
kono
parents:
diff changeset
213 return p;
kono
parents:
diff changeset
214 }
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 extern "C"
kono
parents:
diff changeset
217 SANITIZER_INTERFACE_ATTRIBUTE
kono
parents:
diff changeset
218 void *__sanitizer_mz_valloc(malloc_zone_t *zone, size_t size) {
kono
parents:
diff changeset
219 COMMON_MALLOC_ENTER();
kono
parents:
diff changeset
220 COMMON_MALLOC_VALLOC(size);
kono
parents:
diff changeset
221 return p;
kono
parents:
diff changeset
222 }
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 // TODO(glider): the allocation callbacks need to be refactored.
kono
parents:
diff changeset
225 extern "C"
kono
parents:
diff changeset
226 SANITIZER_INTERFACE_ATTRIBUTE
kono
parents:
diff changeset
227 void __sanitizer_mz_free(malloc_zone_t *zone, void *ptr) {
kono
parents:
diff changeset
228 if (!ptr) return;
kono
parents:
diff changeset
229 COMMON_MALLOC_FREE(ptr);
kono
parents:
diff changeset
230 }
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 #define GET_ZONE_FOR_PTR(ptr) \
kono
parents:
diff changeset
233 malloc_zone_t *zone_ptr = malloc_zone_from_ptr(ptr); \
kono
parents:
diff changeset
234 const char *zone_name = (zone_ptr == 0) ? 0 : zone_ptr->zone_name
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 extern "C"
kono
parents:
diff changeset
237 SANITIZER_INTERFACE_ATTRIBUTE
kono
parents:
diff changeset
238 void *__sanitizer_mz_realloc(malloc_zone_t *zone, void *ptr, size_t new_size) {
kono
parents:
diff changeset
239 if (!ptr) {
kono
parents:
diff changeset
240 COMMON_MALLOC_MALLOC(new_size);
kono
parents:
diff changeset
241 return p;
kono
parents:
diff changeset
242 } else {
kono
parents:
diff changeset
243 COMMON_MALLOC_SIZE(ptr);
kono
parents:
diff changeset
244 if (size) {
kono
parents:
diff changeset
245 COMMON_MALLOC_REALLOC(ptr, new_size);
kono
parents:
diff changeset
246 return p;
kono
parents:
diff changeset
247 } else {
kono
parents:
diff changeset
248 // We can't recover from reallocating an unknown address, because
kono
parents:
diff changeset
249 // this would require reading at most |new_size| bytes from
kono
parents:
diff changeset
250 // potentially unaccessible memory.
kono
parents:
diff changeset
251 GET_ZONE_FOR_PTR(ptr);
kono
parents:
diff changeset
252 COMMON_MALLOC_REPORT_UNKNOWN_REALLOC(ptr, zone_ptr, zone_name);
kono
parents:
diff changeset
253 return nullptr;
kono
parents:
diff changeset
254 }
kono
parents:
diff changeset
255 }
kono
parents:
diff changeset
256 }
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 extern "C"
kono
parents:
diff changeset
259 SANITIZER_INTERFACE_ATTRIBUTE
kono
parents:
diff changeset
260 void __sanitizer_mz_destroy(malloc_zone_t* zone) {
kono
parents:
diff changeset
261 // A no-op -- we will not be destroyed!
kono
parents:
diff changeset
262 Report("__sanitizer_mz_destroy() called -- ignoring\n");
kono
parents:
diff changeset
263 }
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 extern "C"
kono
parents:
diff changeset
266 SANITIZER_INTERFACE_ATTRIBUTE
kono
parents:
diff changeset
267 void *__sanitizer_mz_memalign(malloc_zone_t *zone, size_t align, size_t size) {
kono
parents:
diff changeset
268 COMMON_MALLOC_ENTER();
kono
parents:
diff changeset
269 COMMON_MALLOC_MEMALIGN(align, size);
kono
parents:
diff changeset
270 return p;
kono
parents:
diff changeset
271 }
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273 // This function is currently unused, and we build with -Werror.
kono
parents:
diff changeset
274 #if 0
kono
parents:
diff changeset
275 void __sanitizer_mz_free_definite_size(
kono
parents:
diff changeset
276 malloc_zone_t* zone, void *ptr, size_t size) {
kono
parents:
diff changeset
277 // TODO(glider): check that |size| is valid.
kono
parents:
diff changeset
278 UNIMPLEMENTED();
kono
parents:
diff changeset
279 }
kono
parents:
diff changeset
280 #endif
kono
parents:
diff changeset
281
kono
parents:
diff changeset
282 kern_return_t mi_enumerator(task_t task, void *,
kono
parents:
diff changeset
283 unsigned type_mask, vm_address_t zone_address,
kono
parents:
diff changeset
284 memory_reader_t reader,
kono
parents:
diff changeset
285 vm_range_recorder_t recorder) {
kono
parents:
diff changeset
286 // Should enumerate all the pointers we have. Seems like a lot of work.
kono
parents:
diff changeset
287 return KERN_FAILURE;
kono
parents:
diff changeset
288 }
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 size_t mi_good_size(malloc_zone_t *zone, size_t size) {
kono
parents:
diff changeset
291 // I think it's always safe to return size, but we maybe could do better.
kono
parents:
diff changeset
292 return size;
kono
parents:
diff changeset
293 }
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 boolean_t mi_check(malloc_zone_t *zone) {
kono
parents:
diff changeset
296 UNIMPLEMENTED();
kono
parents:
diff changeset
297 }
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 void mi_print(malloc_zone_t *zone, boolean_t verbose) {
kono
parents:
diff changeset
300 UNIMPLEMENTED();
kono
parents:
diff changeset
301 }
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 void mi_log(malloc_zone_t *zone, void *address) {
kono
parents:
diff changeset
304 // I don't think we support anything like this
kono
parents:
diff changeset
305 }
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 void mi_force_lock(malloc_zone_t *zone) {
kono
parents:
diff changeset
308 COMMON_MALLOC_FORCE_LOCK();
kono
parents:
diff changeset
309 }
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 void mi_force_unlock(malloc_zone_t *zone) {
kono
parents:
diff changeset
312 COMMON_MALLOC_FORCE_UNLOCK();
kono
parents:
diff changeset
313 }
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 void mi_statistics(malloc_zone_t *zone, malloc_statistics_t *stats) {
kono
parents:
diff changeset
316 COMMON_MALLOC_FILL_STATS(zone, stats);
kono
parents:
diff changeset
317 }
kono
parents:
diff changeset
318
kono
parents:
diff changeset
319 boolean_t mi_zone_locked(malloc_zone_t *zone) {
kono
parents:
diff changeset
320 // UNIMPLEMENTED();
kono
parents:
diff changeset
321 return false;
kono
parents:
diff changeset
322 }
kono
parents:
diff changeset
323
kono
parents:
diff changeset
324 } // unnamed namespace
kono
parents:
diff changeset
325
kono
parents:
diff changeset
326 namespace COMMON_MALLOC_NAMESPACE {
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 void ReplaceSystemMalloc() {
kono
parents:
diff changeset
329 static malloc_introspection_t sanitizer_zone_introspection;
kono
parents:
diff changeset
330 // Ok to use internal_memset, these places are not performance-critical.
kono
parents:
diff changeset
331 internal_memset(&sanitizer_zone_introspection, 0,
kono
parents:
diff changeset
332 sizeof(sanitizer_zone_introspection));
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 sanitizer_zone_introspection.enumerator = &mi_enumerator;
kono
parents:
diff changeset
335 sanitizer_zone_introspection.good_size = &mi_good_size;
kono
parents:
diff changeset
336 sanitizer_zone_introspection.check = &mi_check;
kono
parents:
diff changeset
337 sanitizer_zone_introspection.print = &mi_print;
kono
parents:
diff changeset
338 sanitizer_zone_introspection.log = &mi_log;
kono
parents:
diff changeset
339 sanitizer_zone_introspection.force_lock = &mi_force_lock;
kono
parents:
diff changeset
340 sanitizer_zone_introspection.force_unlock = &mi_force_unlock;
kono
parents:
diff changeset
341 sanitizer_zone_introspection.statistics = &mi_statistics;
kono
parents:
diff changeset
342 sanitizer_zone_introspection.zone_locked = &mi_zone_locked;
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 internal_memset(&sanitizer_zone, 0, sizeof(malloc_zone_t));
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 // Use version 6 for OSX >= 10.6.
kono
parents:
diff changeset
347 sanitizer_zone.version = 6;
kono
parents:
diff changeset
348 sanitizer_zone.zone_name = COMMON_MALLOC_ZONE_NAME;
kono
parents:
diff changeset
349 sanitizer_zone.size = &__sanitizer_mz_size;
kono
parents:
diff changeset
350 sanitizer_zone.malloc = &__sanitizer_mz_malloc;
kono
parents:
diff changeset
351 sanitizer_zone.calloc = &__sanitizer_mz_calloc;
kono
parents:
diff changeset
352 sanitizer_zone.valloc = &__sanitizer_mz_valloc;
kono
parents:
diff changeset
353 sanitizer_zone.free = &__sanitizer_mz_free;
kono
parents:
diff changeset
354 sanitizer_zone.realloc = &__sanitizer_mz_realloc;
kono
parents:
diff changeset
355 sanitizer_zone.destroy = &__sanitizer_mz_destroy;
kono
parents:
diff changeset
356 sanitizer_zone.batch_malloc = 0;
kono
parents:
diff changeset
357 sanitizer_zone.batch_free = 0;
kono
parents:
diff changeset
358 sanitizer_zone.free_definite_size = 0;
kono
parents:
diff changeset
359 sanitizer_zone.memalign = &__sanitizer_mz_memalign;
kono
parents:
diff changeset
360 sanitizer_zone.introspect = &sanitizer_zone_introspection;
kono
parents:
diff changeset
361
kono
parents:
diff changeset
362 // Register the zone.
kono
parents:
diff changeset
363 malloc_zone_register(&sanitizer_zone);
kono
parents:
diff changeset
364 }
kono
parents:
diff changeset
365
kono
parents:
diff changeset
366 } // namespace COMMON_MALLOC_NAMESPACE