Fix usingJEMalloc with Clang
authorGiuseppe Ottaviano <ott@fb.com>
Thu, 19 Nov 2015 19:39:27 +0000 (11:39 -0800)
committerfacebook-github-bot-9 <folly-bot@fb.com>
Thu, 19 Nov 2015 20:20:28 +0000 (12:20 -0800)
Summary: Clang is too clever and in some contexts optimizes away the `malloc`, but we rely on a side-effect. Declaring the variable as static forces it to call `malloc`. We could free the pointer relying on the fact that the lambda is guaranteed to be called only once, but I feel more comfortable just leaking it (LSan won't complain).

Reviewed By: philippv

Differential Revision: D2674769

fb-gh-sync-id: 1153a3ca226c6b7aa64c453bd61b036dcbf3ffcc

folly/Malloc.h

index 978cd1339f9c847f06f49f1c8aa058ce2e5ed38b..d779a063d532c966c0dc445158b763f38df5bd3d 100644 (file)
@@ -159,12 +159,14 @@ inline bool usingJEMalloc() noexcept {
 
     uint64_t origAllocated = *counter;
 
-    void* ptr = malloc(1);
+    // Static because otherwise clever compilers will find out that
+    // the ptr is not used and does not escape the scope, so they will
+    // just optimize away the malloc.
+    static void* ptr = malloc(1);
     if (!ptr) {
       // wtf, failing to allocate 1 byte
       return false;
     }
-    free(ptr);
 
     return (origAllocated != *counter);
   }();