On 12/2/18 10:39 AM, Richard W.M. Jones wrote:
By default valgrind suppresses many leaks.  I'm not even sure exactly
how it decides which ones to suppress, but certainly global variables
pointing to malloc’d data are suppressed, which is not useful
behaviour.

Here's my understanding of why that is the default - if you assign malloc()d storage into a global, then that storage is in scope right up until you call exit(). And it's faster (and often easier) to exit() a process with memory still allocated (the OS will clean it up anyways) than it is to manually chase down the memory cleanups yourself.


Tell valgrind to show all leaks.  It won't give an error on them.

However to do this we also need a much more comprehensive list of
suppressions so that we don't constantly show unavoidable leaks in
(eg) dlopen.  This adds separate files for each class of suppressions
in a new valgrind/ directory.
---
  .gitignore                                    |   1 +
  Makefile.am                                   |   2 +-
  configure.ac                                  |   3 +-
  valgrind/Makefile.am                          |  47 ++++++++
  valgrind/glibc.suppressions                   | 106 ++++++++++++++++++
  .../nbdkit.suppressions                       |  21 +---
  valgrind/perl.suppressions                    |  40 +++++++
  wrapper.c                                     |   3 +-
  8 files changed, 205 insertions(+), 18 deletions(-)


+++ b/valgrind/Makefile.am
@@ -0,0 +1,47 @@

+include $(top_srcdir)/common-rules.mk
+
+suppressions_files = $(wildcard *.suppressions)

A GNU make-ism - but you already mention requiring GNU make in README. Should we make ./configure error out hard if $MAKE is not GNU Make, rather than risking someone getting 80% though a build on BSD make and then choking when it gets here?

+++ b/wrapper.c
@@ -130,8 +130,9 @@ main (int argc, char *argv[])
      passthru (VALGRIND);
      passthru ("--vgdb=no");
      passthru ("--leak-check=full");
+    passthru ("--show-leak-kinds=all");

I could understand this if we were implementing a library and wanted to make it easier for some other user to call our library shutdown to reclaim all memory that we otherwise stashed in globals - but when we are just a standalone app, do we really need to worry about memory still reachable in globals, as that's not a true leak?

      passthru ("--error-exitcode=119");
-    passthru_format ("--suppressions=%s/valgrind-suppressions", srcdir);
+    passthru_format ("--suppressions=%s/valgrind/suppressions", builddir);

Is this still right under VPATH?

      passthru ("--trace-children=no");
      passthru ("--run-libc-freeres=no");
      passthru ("--num-callers=20");


--
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

_______________________________________________
Libguestfs mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libguestfs

Reply via email to