Workaround issue with address sanitizer

This commit is contained in:
Patrick Pelissier committed 2021-03-14 21:26:04 +01:00
1 parent a044fadec8
commit 2f10aba390
1 file changed
+22 -4
+22 -4
View File
@@ -193,6 +193,16 @@
#endif #endif
/* Autodetect if Address sanitizer is run */
#if defined(__has_feature)
# if __has_feature(address_sanitizer)
# define M_ADDRESS_SANITIZER 1
# endif
#endif
#if defined(__SANITIZE_ADDRESS__) && !defined(M_ADDRESS_SANITIZER)
# define M_ADDRESS_SANITIZER 1
#endif
/* /*
* Do not create the following symbols that are defined in GLIBC malloc.h * Do not create the following symbols that are defined in GLIBC malloc.h
* M_MXFAST * M_MXFAST
@@ -2175,7 +2185,6 @@ M_PARSE_DEFAULT_TYPE_DEF(m_core_parse_ldouble, long double, strtold, )
# define M_MIN_FLEX_ARRAY_SIZE # define M_MIN_FLEX_ARRAY_SIZE
#endif #endif
#if M_USE_STDARG #if M_USE_STDARG
/* Define the allocation of the temporary string used by M_CSTR /* Define the allocation of the temporary string used by M_CSTR
@@ -2219,7 +2228,7 @@ namespace m_lib {
#define M_CSTR(...) \ #define M_CSTR(...) \
(m_lib::m_char_array<M_USE_CSTR_ALLOC>(__VA_ARGS__)).m_get() (m_lib::m_char_array<M_USE_CSTR_ALLOC>(__VA_ARGS__)).m_get()
#elif defined(__GNUC__) #elif defined(__GNUC__) && !defined(M_ADDRESS_SANITIZER)
/* Return a constant string constructed based on the printf-liked formated string /* Return a constant string constructed based on the printf-liked formated string
and its arguments. and its arguments.
@@ -2228,8 +2237,16 @@ namespace m_lib {
the string is truncated. the string is truncated.
Example: Example:
strlen( M_CSTR("Len=%d", 17) ) == 6 strlen( M_CSTR("Len=%d", 17) ) == 6
NOTE: C definition using GNU C extension which produces smaller & faster NOTE: C definition using GNU C extension statement expression to produce
code and enables the compiler to produce better warnings. smaller & faster code and enables the compiler to produce better warnings.
In C, the return value is the array, not the pointer to the array
(if I understand https://gcc.gnu.org/onlinedocs/gcc-10.2.0/gcc/Statement-Exprs.html
correctly, it is specified that only G++ converts the final result value
if it is an array to a pointer), so the return value is given back
to the parent scope.
However, address sanitizer doesn't see this particular corner case,
and raise an error.
So let's disable this implementation if address sanitizer is enabled.
*/ */
#define M_CSTR(...) \ #define M_CSTR(...) \
M_ATTR_EXTENSION ({char m_core_tmp[M_USE_CSTR_ALLOC]; \ M_ATTR_EXTENSION ({char m_core_tmp[M_USE_CSTR_ALLOC]; \
@@ -2258,6 +2275,7 @@ m_core_snprintf(char *str, size_t size, const char *format, ...)
Example: Example:
strlen( M_CSTR("Len=%d", 17) ) == 6 strlen( M_CSTR("Len=%d", 17) ) == 6
NOTE: C definition using compound litteral (init to 0). NOTE: C definition using compound litteral (init to 0).
This has a bad performance impact since it clears the memory before using it.
*/ */
#define M_CSTR(...) \ #define M_CSTR(...) \
m_core_snprintf( (char [M_USE_CSTR_ALLOC]){0}, M_USE_CSTR_ALLOC, __VA_ARGS__) m_core_snprintf( (char [M_USE_CSTR_ALLOC]){0}, M_USE_CSTR_ALLOC, __VA_ARGS__)