mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-25 03:32:12 +01:00
Merge branch 'lsan-dynamic-loading' into 'main'
glib-private: Check for LSAN support at runtime when controlling it See merge request GNOME/glib!3672
This commit is contained in:
commit
6d45bdb1bf
@ -37,14 +37,51 @@
|
|||||||
/*
|
/*
|
||||||
* %_GLIB_ADDRESS_SANITIZER:
|
* %_GLIB_ADDRESS_SANITIZER:
|
||||||
*
|
*
|
||||||
* Private macro defined if the AddressSanitizer is in use.
|
* Private macro defined if the AddressSanitizer is in use by GLib itself.
|
||||||
*/
|
*/
|
||||||
#define _GLIB_ADDRESS_SANITIZER
|
#define _GLIB_ADDRESS_SANITIZER
|
||||||
|
|
||||||
#include <sanitizer/lsan_interface.h>
|
#include <sanitizer/lsan_interface.h>
|
||||||
|
|
||||||
|
/* If GLib itself is not compiled with ASAN sanitizer we may still want to
|
||||||
|
* control it in case it's linked by the loading application, so we need to
|
||||||
|
* do this check dynamically.
|
||||||
|
* However MinGW doesn't support weak attribute properly (even if it advertises
|
||||||
|
* it), so we ignore it in such case since it's not convenient to go through
|
||||||
|
* dlsym().
|
||||||
|
* Under MSVC we could use alternatename, but it doesn't seem to be as reliable
|
||||||
|
* as we'd like: https://stackoverflow.com/a/11529277/210151 and
|
||||||
|
* https://devblogs.microsoft.com/oldnewthing/20200731-00/?p=104024
|
||||||
|
*/
|
||||||
|
#elif defined (G_OS_UNIX) && g_macro__has_attribute (weak)
|
||||||
|
|
||||||
|
#define HAS_DYNAMIC_ASAN_LOADING
|
||||||
|
|
||||||
|
void __lsan_enable (void) __attribute__ ((weak));
|
||||||
|
void __lsan_disable (void) __attribute__ ((weak));
|
||||||
|
void __lsan_ignore_object (const void *p) __attribute__ ((weak));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* g_leak_sanitizer_is_supported:
|
||||||
|
*
|
||||||
|
* Checks at runtime if LeakSanitizer is currently supported by the running
|
||||||
|
* binary. This may imply that GLib itself is not compiled with sanitizer
|
||||||
|
* but that the loading program is.
|
||||||
|
*/
|
||||||
|
static inline gboolean
|
||||||
|
g_leak_sanitizer_is_supported (void)
|
||||||
|
{
|
||||||
|
#if defined (_GLIB_ADDRESS_SANITIZER)
|
||||||
|
return TRUE;
|
||||||
|
#elif defined (HAS_DYNAMIC_ASAN_LOADING)
|
||||||
|
return __lsan_enable != NULL && __lsan_ignore_object != NULL;
|
||||||
|
#else
|
||||||
|
return FALSE;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* g_ignore_leak:
|
* g_ignore_leak:
|
||||||
* @p: any pointer
|
* @p: any pointer
|
||||||
@ -57,9 +94,12 @@
|
|||||||
static inline void
|
static inline void
|
||||||
g_ignore_leak (gconstpointer p)
|
g_ignore_leak (gconstpointer p)
|
||||||
{
|
{
|
||||||
#ifdef _GLIB_ADDRESS_SANITIZER
|
#if defined (_GLIB_ADDRESS_SANITIZER)
|
||||||
if (p != NULL)
|
if (p != NULL)
|
||||||
__lsan_ignore_object (p);
|
__lsan_ignore_object (p);
|
||||||
|
#elif defined (HAS_DYNAMIC_ASAN_LOADING)
|
||||||
|
if (p != NULL && __lsan_ignore_object != NULL)
|
||||||
|
__lsan_ignore_object (p);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,9 +113,11 @@ g_ignore_leak (gconstpointer p)
|
|||||||
static inline void
|
static inline void
|
||||||
g_ignore_strv_leak (GStrv strv)
|
g_ignore_strv_leak (GStrv strv)
|
||||||
{
|
{
|
||||||
#ifdef _GLIB_ADDRESS_SANITIZER
|
|
||||||
gchar **item;
|
gchar **item;
|
||||||
|
|
||||||
|
if (!g_leak_sanitizer_is_supported ())
|
||||||
|
return;
|
||||||
|
|
||||||
if (strv)
|
if (strv)
|
||||||
{
|
{
|
||||||
g_ignore_leak (strv);
|
g_ignore_leak (strv);
|
||||||
@ -83,7 +125,6 @@ g_ignore_strv_leak (GStrv strv)
|
|||||||
for (item = strv; *item != NULL; item++)
|
for (item = strv; *item != NULL; item++)
|
||||||
g_ignore_leak (*item);
|
g_ignore_leak (*item);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -98,8 +139,11 @@ g_ignore_strv_leak (GStrv strv)
|
|||||||
static inline void
|
static inline void
|
||||||
g_begin_ignore_leaks (void)
|
g_begin_ignore_leaks (void)
|
||||||
{
|
{
|
||||||
#ifdef _GLIB_ADDRESS_SANITIZER
|
#if defined (_GLIB_ADDRESS_SANITIZER)
|
||||||
__lsan_disable ();
|
__lsan_disable ();
|
||||||
|
#elif defined (HAS_DYNAMIC_ASAN_LOADING)
|
||||||
|
if (__lsan_disable != NULL)
|
||||||
|
__lsan_disable ();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,11 +156,16 @@ g_begin_ignore_leaks (void)
|
|||||||
static inline void
|
static inline void
|
||||||
g_end_ignore_leaks (void)
|
g_end_ignore_leaks (void)
|
||||||
{
|
{
|
||||||
#ifdef _GLIB_ADDRESS_SANITIZER
|
#if defined (_GLIB_ADDRESS_SANITIZER)
|
||||||
__lsan_enable ();
|
__lsan_enable ();
|
||||||
|
#elif defined (HAS_DYNAMIC_ASAN_LOADING)
|
||||||
|
if (__lsan_enable != NULL)
|
||||||
|
__lsan_enable ();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef HAS_DYNAMIC_ASAN_LOADING
|
||||||
|
|
||||||
GMainContext * g_get_worker_context (void);
|
GMainContext * g_get_worker_context (void);
|
||||||
gboolean g_check_setuid (void);
|
gboolean g_check_setuid (void);
|
||||||
GMainContext * g_main_context_new_with_next_id (guint next_id);
|
GMainContext * g_main_context_new_with_next_id (guint next_id);
|
||||||
|
@ -185,6 +185,7 @@
|
|||||||
#define g_macro__has_attribute___pure__ G_GNUC_CHECK_VERSION (2, 96)
|
#define g_macro__has_attribute___pure__ G_GNUC_CHECK_VERSION (2, 96)
|
||||||
#define g_macro__has_attribute___sentinel__ G_GNUC_CHECK_VERSION (4, 0)
|
#define g_macro__has_attribute___sentinel__ G_GNUC_CHECK_VERSION (4, 0)
|
||||||
#define g_macro__has_attribute___unused__ G_GNUC_CHECK_VERSION (2, 4)
|
#define g_macro__has_attribute___unused__ G_GNUC_CHECK_VERSION (2, 4)
|
||||||
|
#define g_macro__has_attribute___weak__ G_GNUC_CHECK_VERSION (2, 8)
|
||||||
#define g_macro__has_attribute_cleanup G_GNUC_CHECK_VERSION (3, 3)
|
#define g_macro__has_attribute_cleanup G_GNUC_CHECK_VERSION (3, 3)
|
||||||
#define g_macro__has_attribute_fallthrough G_GNUC_CHECK_VERSION (6, 0)
|
#define g_macro__has_attribute_fallthrough G_GNUC_CHECK_VERSION (6, 0)
|
||||||
#define g_macro__has_attribute_may_alias G_GNUC_CHECK_VERSION (3, 3)
|
#define g_macro__has_attribute_may_alias G_GNUC_CHECK_VERSION (3, 3)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user