[glib/wip/smcv/address-sanitizer: 18/20] glib-private: Add wrappers for telling AddressSanitizer to ignore leaks




commit 6c7d9e0389ca459ae530f8c0bdac48411827fdba
Author: Simon McVittie <smcv collabora com>
Date:   Fri Jan 29 19:11:11 2021 +0000

    glib-private: Add wrappers for telling AddressSanitizer to ignore leaks
    
    Signed-off-by: Simon McVittie <smcv collabora com>

 glib/glib-private.h | 43 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)
---
diff --git a/glib/glib-private.h b/glib/glib-private.h
index c2e7fd401..8de380d12 100644
--- a/glib/glib-private.h
+++ b/glib/glib-private.h
@@ -33,7 +33,50 @@
  */
 #define _GLIB_ADDRESS_SANITIZER
 
+#include <sanitizer/lsan_interface.h>
+
+#endif
+
+/*
+ * g_ignore_leak:
+ * @p: any pointer
+ *
+ * Tell AddressSanitizer and similar tools that if the object pointed to
+ * by @p is leaked, it is not a problem. Use this to suppress memory leak
+ * reports when a potentially unreachable pointer is deliberately not
+ * going to be deallocated.
+ */
+static inline void
+g_ignore_leak (gconstpointer p)
+{
+#ifdef _GLIB_ADDRESS_SANITIZER
+  if (p != NULL)
+    __lsan_ignore_object (p);
+#endif
+}
+
+/*
+ * g_ignore_strv_leak:
+ * @strv: (nullable) (array zero-terminated=1): an array of strings
+ *
+ * The same as g_ignore_leak(), but for the memory pointed to by @strv,
+ * and for each element of @strv.
+ */
+static inline void
+g_ignore_strv_leak (GStrv strv)
+{
+#ifdef _GLIB_ADDRESS_SANITIZER
+  gchar **item;
+
+  if (strv)
+    {
+      g_ignore_leak (strv);
+
+      for (item = strv; *item != NULL; item++)
+        g_ignore_leak (*item);
+    }
 #endif
+}
 
 GMainContext *          g_get_worker_context            (void);
 gboolean                g_check_setuid                  (void);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]