[glib] glib: Add installed Valgrind suppressions file for GLib and GIO



commit a24f57b071758b01500e2b4b9c05d2a60f8280bf
Author: Philip Withnall <philip withnall collabora co uk>
Date:   Sun Oct 30 20:38:57 2016 -0700

    glib: Add installed Valgrind suppressions file for GLib and GIO
    
    While we cannot get Valgrind to automatically load this suppression file
    for applications which link to GLib
    (https://bugs.kde.org/show_bug.cgi?id=160905), we can at least install
    it on systems in a shared directory, so that developers can use a
    standardised (and up-to-date) suppressions file for GLib, rather than
    rolling their own.
    
    The file will typically be installed to:
       /usr/share/glib-2.0/valgrind/glib.supp
    
    Distributors: it is recommended that this suppression file be installed
    as part of the development package for GLib in your distribution.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=666114

 Makefile.am |    4 +
 glib.supp   |  493 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 497 insertions(+), 0 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index a1c9c33..54f22ee 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -103,6 +103,10 @@ endif
 
 $(pkgconfig_DATA): config.status
 
+# Install Valgrind suppression file
+valgrinddir = $(datadir)/glib-2.0/valgrind
+dist_valgrind_DATA = glib.supp
+
 # build documentation when doing distcheck
 DISTCHECK_CONFIGURE_FLAGS = --enable-debug --enable-gtk-doc --enable-man --disable-maintainer-mode
 
diff --git a/glib.supp b/glib.supp
new file mode 100644
index 0000000..ccfab67
--- /dev/null
+++ b/glib.supp
@@ -0,0 +1,493 @@
+# GLib Valgrind suppressions file
+#
+# This provides a list of suppressions for all of GLib (including GIO), for all
+# Valgrind tools (memcheck, drd, helgrind, etc.) for the false positives and
+# deliberate one-time leaks which GLib causes to be reported when running under
+# Valgrind.
+#
+# When running an application which links to GLib under Valgrind, you can pass
+# this suppression file to Valgrind using --suppressions=/path/to/glib-2.0.supp.
+#
+# http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress
+#
+# Note that there is currently no way for Valgrind to load this automatically
+# (https://bugs.kde.org/show_bug.cgi?id=160905), so the best GLib can currently
+# do is to install this file as part of its development package.
+#
+# This file should be updated if GLib introduces a new deliberate one-time leak,
+# or another false race positive in Valgrind: please file bugs at:
+#
+# https://bugzilla.gnome.org/enter_bug.cgi?product=glib
+
+{
+       gnutls-init-calloc
+       Memcheck:Leak
+       fun:calloc
+       ...
+       fun:gtls_gnutls_init
+}
+
+{
+       gnutls-init-realloc
+       Memcheck:Leak
+       fun:realloc
+       ...
+       fun:gtls_gnutls_init
+}
+
+{
+       g-tls-backend-gnutls-init
+       Memcheck:Leak
+       fun:g_once_impl
+       fun:g_tls_backend_gnutls_init
+}
+
+{
+       p11-tokens-init
+       Memcheck:Leak
+       fun:calloc
+       ...
+       fun:create_tokens_inlock
+       fun:initialize_module_inlock_reentrant
+}
+
+{
+       gobject-init-malloc
+       Memcheck:Leak
+       fun:malloc
+       ...
+       fun:gobject_init_ctor
+}
+
+{
+       gobject-init-realloc
+       Memcheck:Leak
+       fun:realloc
+       ...
+       fun:gobject_init_ctor
+}
+
+{
+       gobject-init-calloc
+       Memcheck:Leak
+       fun:calloc
+       ...
+       fun:gobject_init_ctor
+}
+
+{
+       g-type-register-dynamic
+       Memcheck:Leak
+       fun:malloc
+       ...
+       fun:g_type_register_dynamic
+}
+
+{
+       g-type-register-static
+       Memcheck:Leak
+       fun:malloc
+       ...
+       fun:g_type_register_static
+}
+
+{
+       g-type-register-static-realloc
+       Memcheck:Leak
+       fun:realloc
+       ...
+       fun:g_type_register_static
+}
+
+{
+       g-type-register-static-calloc
+       Memcheck:Leak
+       fun:calloc
+       ...
+       fun:g_type_register_static
+}
+
+{
+       g-type-add-interface-dynamic
+       Memcheck:Leak
+       fun:malloc
+       ...
+       fun:g_type_add_interface_dynamic
+}
+
+{
+       g-type-add-interface-static
+       Memcheck:Leak
+       fun:malloc
+       ...
+       fun:g_type_add_interface_static
+}
+
+{
+       g-test-rand-init
+       Memcheck:Leak
+       fun:calloc
+       ...
+       fun:g_rand_new_with_seed_array
+       fun:test_run_seed
+       ...
+       fun:g_test_run
+}
+
+{
+       g-test-rand-init2
+       Memcheck:Leak
+       fun:calloc
+       ...
+       fun:g_rand_new_with_seed_array
+       ...
+       fun:get_global_random
+       ...
+       fun:g_test_init
+}
+
+{
+       g-quark-table-new
+       Memcheck:Leak
+       fun:g_hash_table_new
+       ...
+       fun:quark_new
+}
+
+{
+       g-quark-table-resize
+       Memcheck:Leak
+       fun:g_hash_table_resize
+       ...
+       fun:quark_new
+}
+
+{
+       g-type-interface-init
+       Memcheck:Leak
+       fun:malloc
+       ...
+       fun:type_iface_vtable_base_init_Wm
+}
+
+{
+       g-type-class-init
+       Memcheck:Leak
+       fun:calloc
+       ...
+       fun:type_class_init_Wm
+}
+
+{
+       g-io-module-default-singleton-malloc
+       Memcheck:Leak
+       fun:malloc
+       ...
+       fun:g_type_create_instance
+       ...
+       fun:_g_io_module_get_default
+}
+
+{
+       g-io-module-default-singleton-module
+       Memcheck:Leak
+       fun:calloc
+       ...
+       fun:g_module_open
+       ...
+       fun:_g_io_module_get_default
+}
+
+{
+       g-get-language-names
+       Memcheck:Leak
+       fun:malloc
+       ...
+       fun:g_get_language_names
+}
+
+{
+       g-static-mutex
+       Memcheck:Leak
+       fun:malloc
+       ...
+       fun:g_static_mutex_get_mutex_impl
+}
+
+{
+       g-system-thread-init
+       Memcheck:Leak
+       fun:calloc
+       ...
+       fun:g_system_thread_new
+}
+
+{
+       g-io-module-default-proxy-resolver-gnome
+       Memcheck:Leak
+       fun:calloc
+       ...
+       fun:g_proxy_resolver_gnome_init
+       ...
+       fun:_g_io_module_get_default
+}
+
+{
+       g-private-get
+       drd:ConflictingAccess
+       fun:g_private_get
+}
+{
+       g-private-get-helgrind
+       Helgrind:Race
+       fun:g_private_get
+}
+
+
+{
+       g-private-set
+       drd:ConflictingAccess
+       fun:g_private_set
+}
+{
+       g-private-set-helgrind
+       Helgrind:Race
+       fun:g_private_set
+}
+
+{
+       g-type-construct-free
+       drd:ConflictingAccess
+       fun:g_type_free_instance
+}
+{
+       g-type-construct-free-helgrind
+       Helgrind:Race
+       fun:g_type_free_instance
+}
+
+{
+       g-variant-unref
+       drd:ConflictingAccess
+       fun:g_variant_unref
+}
+{
+       g-variant-unref-helgrind
+       Helgrind:Race
+       fun:g_variant_unref
+}
+
+{
+       g-unix-signals-main
+       drd:ConflictingAccess
+       fun:_g_main_create_unix_signal_watch
+}
+{
+       g-unix-signals-dispatch
+       drd:ConflictingAccess
+       ...
+       fun:dispatch_unix_signals*
+}
+{
+       g-unix-signals-dispatch-helgrind
+       Helgrind:Race
+       ...
+       fun:dispatch_unix_signals*
+}
+{
+       g-unix-signals-other
+       drd:ConflictingAccess
+       fun:g_unix_signal_watch*
+}
+{
+       g-unix-signals-other-helgrind
+       Helgrind:Race
+       fun:g_unix_signal_watch*
+}
+{
+       g-unix-signals-handler
+       drd:ConflictingAccess
+       fun:g_unix_signal_handler*
+}
+{
+       g-unix-signals-handler-helgrind
+       Helgrind:Race
+       fun:g_unix_signal_handler*
+}
+{
+       g-unix-signals-worker
+       drd:ConflictingAccess
+       fun:glib_worker_main
+}
+{
+       g-unix-signals-worker-helgrind
+       Helgrind:Race
+       fun:glib_worker_main
+}
+
+{
+       g-wakeup-acknowledge
+       drd:ConflictingAccess
+       fun:read
+       fun:g_wakeup_acknowledge
+}
+
+{
+       g-type-fundamental
+       drd:ConflictingAccess
+       fun:g_type_fundamental
+}
+{
+       g-type-fundamental-helgrind
+       Helgrind:Race
+       fun:g_type_fundamental
+}
+{
+       g-type-class-peek-static
+       drd:ConflictingAccess
+       fun:g_type_class_peek_static
+}
+{
+       g-type-class-peek-static-helgrind
+       Helgrind:Race
+       fun:g_type_class_peek_static
+}
+{
+       g-type-is-a
+       drd:ConflictingAccess
+       ...
+       fun:g_type_is_a
+}
+{
+       g-type-is-a-helgrind
+       Helgrind:Race
+       ...
+       fun:g_type_is_a
+}
+
+{
+       g-inet-address-get-type
+       drd:ConflictingAccess
+       fun:g_inet_address_get_type
+}
+{
+       g-inet-address-get-type-helgrind
+       Helgrind:Race
+       fun:g_inet_address_get_type
+}
+
+# From: https://github.com/fredericgermain/valgrind/blob/master/glibc-2.X-drd.supp
+{
+       drd-libc-stdio
+       drd:ConflictingAccess
+       obj:*/lib*/libc-*
+}
+{
+       drd-libc-recv
+       drd:ConflictingAccess
+       fun:recv
+}
+{
+       drd-libc-send
+       drd:ConflictingAccess
+       fun:send
+}
+
+# GSources do an opportunistic ref count check
+{
+       g-source-set-ready-time
+       drd:ConflictingAccess
+       fun:g_source_set_ready_time
+}
+{
+       g-source-set-ready-time-helgrind
+       Helgrind:Race
+       fun:g_source_set_ready_time
+}
+
+{
+       g-source-iter-next
+       Helgrind:Race
+       fun:g_source_iter_next
+       fun:g_main_context_*
+       fun:g_main_context_iterate
+}
+
+{
+       g-object-instance-private
+       drd:ConflictingAccess
+       fun:*_get_instance_private
+}
+{
+       g-object-instance-private-helgrind
+       Helgrind:Race
+       fun:*_get_instance_private
+}
+
+# GLib legitimately calls pthread_cond_signal without a mutex held
+{
+       g-task-thread-complete
+       drd:CondErr
+       ...
+       fun:g_cond_signal
+       fun:g_task_thread_complete
+}
+{
+       g-task-thread-complete
+       Helgrind:Misc
+       ...
+       fun:g_cond_signal
+       fun:g_task_thread_complete
+}
+
+# False positive, but I can't explain how (FIXME)
+{
+       g-task-cond
+       Helgrind:Misc
+       ...
+       fun:g_cond_clear
+       fun:g_task_finalize
+}
+
+# Real race, but is_cancelled() is an opportunistic function anyway
+{
+       g-cancellable-is-cancelled
+       Helgrind:Race
+       fun:g_cancellable_is_cancelled
+}
+
+# False positive
+{
+       g-main-context-cond
+       Helgrind:Misc
+       ...
+       fun:g_cond_clear
+       fun:g_main_context_unref
+}
+
+# False positives
+{
+       g-source-unlocked
+       Helgrind:Race
+       fun:g_source_*_unlocked
+}
+{
+       g-source-internal
+       Helgrind:Race
+       fun:g_source_*_internal
+}
+
+# False positive
+{
+       g_object_real_dispose
+       Helgrind:Race
+       fun:g_object_real_dispose
+}
+
+# False positive
+{
+       g_object_new_valist
+       Helgrind:Race
+       ...
+       fun:g_object_new_valist
+}


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