Workaround issue with address sanitizer
This commit is contained in:
1 parent
a044fadec8
commit
2f10aba390
1 file changed
+22
-4
@@ -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__)
|
||||||
|
|||||||
Reference in new issue
Block a user