folly: add a FOLLY_SANITIZE_ADDRESS macro to Portability.h
[folly.git] / folly / Portability.h
index 89d5199ed4b6645fab88c4e6a463905ae0a1b454..fe38d6b5bbbc682f47ca3e152f65ce0544e1d0f0 100644 (file)
@@ -84,11 +84,24 @@ struct MaxAlign { char c; } __attribute__((aligned));
 # endif
 #endif
 
+
+/* Define a convenience macro to test when address sanitizer is being used
+ * across the different compilers (e.g. clang, gcc) */
+#if defined(__clang__)
+# if __has_feature(address_sanitizer)
+#  define FOLLY_SANITIZE_ADDRESS 1
+# endif
+#elif defined (__GNUC__) && \
+      (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 8)) || (__GNUC__ >= 5)) && \
+      __SANITIZE_ADDRESS__
+# define FOLLY_SANITIZE_ADDRESS 1
+#endif
+
 /* Define attribute wrapper for function attribute used to disable
  * address sanitizer instrumentation. Unfortunately, this attribute
  * has issues when inlining is used, so disable that as well. */
-#if defined(__clang__)
-# if __has_feature(address_sanitizer)
+#ifdef FOLLY_SANITIZE_ADDRESS
+# if defined(__clang__)
 #  if __has_attribute(__no_address_safety_analysis__)
 #   define FOLLY_DISABLE_ADDRESS_SANITIZER \
       __attribute__((__no_address_safety_analysis__, __noinline__))
@@ -96,13 +109,10 @@ struct MaxAlign { char c; } __attribute__((aligned));
 #   define FOLLY_DISABLE_ADDRESS_SANITIZER \
       __attribute__((__no_sanitize_address__, __noinline__))
 #  endif
+# elif defined(__GNUC__)
+#  define FOLLY_DISABLE_ADDRESS_SANITIZER \
+     __attribute__((__no_address_safety_analysis__, __noinline__))
 # endif
-#elif defined (__GNUC__) && \
-      (__GNUC__ == 4) && \
-      (__GNUC_MINOR__ >= 8) && \
-      __SANITIZE_ADDRESS__
-# define FOLLY_DISABLE_ADDRESS_SANITIZER \
-    __attribute__((__no_address_safety_analysis__, __noinline__))
 #endif
 #ifndef FOLLY_DISABLE_ADDRESS_SANITIZER
 # define FOLLY_DISABLE_ADDRESS_SANITIZER