[PATCH] D26150: [libc++abi] Fix test_exception_storage_nodynmem on MacOS

Shoaib Meenai via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 31 08:01:48 PDT 2016

smeenai created this revision.
smeenai added reviewers: compnerd, EricWF, howard.hinnant, ikudrin, mclow.lists.
smeenai added a subscriber: cfe-commits.

Mach-O defaults to two-level namespaces, so `calloc` cannot be
interpositoned. Override it via the default malloc zone instead.

Note: `DYLD_FORCE_FLAT_NAMESPACE` can be used to enable interpositioning
on Mach-O, but `calloc` is used during library initialization, so
replacing it with a version which always returns NULL causes segfaults.
This could be worked around, but malloc zones are a cleaner solution.



Index: test/test_exception_storage_nodynmem.pass.cpp
--- test/test_exception_storage_nodynmem.pass.cpp
+++ test/test_exception_storage_nodynmem.pass.cpp
@@ -17,16 +17,28 @@
 #include <assert.h>
 #include <cstdlib>
+#if defined(__APPLE__)
+#include <malloc/malloc.h>
 static bool OverwrittenCallocCalled = false;
 // Override calloc to simulate exhaustion of dynamic memory
+#if !defined(__APPLE__)
 void *calloc(size_t, size_t) {
+void *calloc(malloc_zone_t *, size_t, size_t) {
     OverwrittenCallocCalled = true;
     return 0;
 int main(int argc, char *argv[]) {
+#if defined(__APPLE__)
+    malloc_zone_t *default_zone = malloc_default_zone();
+    default_zone->calloc = calloc;
     // Run the test a couple of times
     // to ensure that fallback memory doesn't leak.
     for (int I = 0; I < 1000; ++I)

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D26150.76409.patch
Type: text/x-patch
Size: 925 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161031/e15f69ad/attachment.bin>

More information about the cfe-commits mailing list