From 6ba64f454da7710f0dcbb28fd574ac3fda7eb00c Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Sun, 29 Sep 2013 00:28:55 +1000 Subject: [PATCH] Close #18596: Support address sanity checking in clang/GCC This patch appropriately marks known false alarms in the small object allocator when address sanity checking is enabled (patch contributed by Dhiru Kholia). --- Misc/ACKS | 1 + Misc/NEWS | 7 +++++++ Objects/obmalloc.c | 20 ++++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/Misc/ACKS b/Misc/ACKS index cb823d1ec1a..5b7b630b948 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -650,6 +650,7 @@ Jim Kerr Magnus Kessler Lawrence Kesteloot Vivek Khera +Dhiru Kholia Mads Kiilerich Jason Killen Jan Kim diff --git a/Misc/NEWS b/Misc/NEWS index ae8631f06a0..449d915eaf8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -94,6 +94,13 @@ Documentation - Issue #17003: Unified the size argument names in the io module with common practice. +Build +----- + +- Issue #18596: Support the use of address sanity checking in recent versions + of clang and GCC by appropriately marking known false alarms in the small + object allocator. Patch contributed by Dhiru Kholia. + Tools/Demos ----------- diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index 4437bf9a659..f7b3e491ca4 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -12,6 +12,24 @@ static void _PyObject_DebugDumpAddress(const void *p); static void _PyMem_DebugCheckAddress(char api_id, const void *p); #endif +#if defined(__has_feature) /* Clang */ + #if __has_feature(address_sanitizer) /* is ASAN enabled? */ + #define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS \ + __attribute__((no_address_safety_analysis)) \ + __attribute__ ((noinline)) + #else + #define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS + #endif +#else + #if defined(__SANITIZE_ADDRESS__) /* GCC 4.8.x, is ASAN enabled? */ + #define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS \ + __attribute__((no_address_safety_analysis)) \ + __attribute__ ((noinline)) + #else + #define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS + #endif +#endif + #ifdef WITH_PYMALLOC #ifdef MS_WINDOWS @@ -1300,6 +1318,7 @@ redirect: /* free */ +ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS static void _PyObject_Free(void *ctx, void *p) { @@ -1528,6 +1547,7 @@ redirect: * return a non-NULL result. */ +ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS static void * _PyObject_Realloc(void *ctx, void *p, size_t nbytes) {