[07/11] libctf: suppress spurious failure of malloc-counting tests under valgrind

Message ID 20240613185430.85352-8-nick.alcock@oracle.com
State New
Headers
Series enumerator query API, plus some bugfixes |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_binutils_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_binutils_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_binutils_check--master-aarch64 success Test passed
linaro-tcwg-bot/tcwg_binutils_check--master-arm success Test passed

Commit Message

Nick Alcock June 13, 2024, 6:54 p.m. UTC
  The libctf-regression/open-error-free.c test works by interposing malloc
and counting mallocs and frees across libctf operations.  This only
works under suitably-interposable mallocs on systems supporting
dlsym (RTLD_NEXT, ...), so its operation is restricted to glibc
systems for now, but also it interacts badly with valgrind, which
interposes malloc itself.  Detect a running valgrind and skip the test.

Add new facilities allowing libctf lookup tests to declare themselves
unsupported, by printing "UNSUPPORTED: " and then some meaningful
message instead of their normal output.

libctf/
	* configure.ac: Check for <valgrind/valgrind.h>.
	* config.h.in: Regenerate.
	* configure: Likewise.
	* testsuite/lib/ctf-lib.exp (run_lookup_test): Add support for
	UNSUPPORTED tests.
	* testsuite/libctf-regression/open-error-free.c: When running
	under valgrind, this test is unsupported.
---
 libctf/config.h.in                                  |  3 +++
 libctf/configure                                    |  2 +-
 libctf/configure.ac                                 |  2 +-
 libctf/testsuite/lib/ctf-lib.exp                    |  5 +++++
 .../testsuite/libctf-regression/open-error-free.c   | 13 +++++++++++++
 5 files changed, 23 insertions(+), 2 deletions(-)
  

Patch

diff --git a/libctf/config.h.in b/libctf/config.h.in
index 794779eab5a..359f1f5ae1d 100644
--- a/libctf/config.h.in
+++ b/libctf/config.h.in
@@ -115,6 +115,9 @@ 
 /* Define to 1 if you have the <unistd.h> header file. */
 #undef HAVE_UNISTD_H
 
+/* Define to 1 if you have the <valgrind/valgrind.h> header file. */
+#undef HAVE_VALGRIND_VALGRIND_H
+
 /* Define to the sub-directory in which libtool stores uninstalled libraries.
    */
 #undef LT_OBJDIR
diff --git a/libctf/configure b/libctf/configure
index 1faadefa068..7466d56a18b 100755
--- a/libctf/configure
+++ b/libctf/configure
@@ -16552,7 +16552,7 @@  $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
  presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
  esac
 
-for ac_header in byteswap.h endian.h
+for ac_header in byteswap.h endian.h valgrind/valgrind.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
diff --git a/libctf/configure.ac b/libctf/configure.ac
index cf0e988f7fb..64544b83a9f 100644
--- a/libctf/configure.ac
+++ b/libctf/configure.ac
@@ -109,7 +109,7 @@  if test $ac_cv_libctf_bfd_elf = yes; then
 fi
 
 AC_C_BIGENDIAN
-AC_CHECK_HEADERS(byteswap.h endian.h)
+AC_CHECK_HEADERS(byteswap.h endian.h valgrind/valgrind.h)
 AC_CHECK_FUNCS(pread)
 
 dnl Check for bswap_{16,32,64}
diff --git a/libctf/testsuite/lib/ctf-lib.exp b/libctf/testsuite/lib/ctf-lib.exp
index eb2b738498d..cfd36bee339 100644
--- a/libctf/testsuite/lib/ctf-lib.exp
+++ b/libctf/testsuite/lib/ctf-lib.exp
@@ -270,6 +270,11 @@  proc run_lookup_test { name } {
 	set results [run_host_cmd "$opts(wrapper) tmpdir/lookup" $lookup_output]
     }
 
+    if { [regexp {^UNSUPPORTED: (.*)$} $results -> reason] } {
+	unsupported "$testname: $reason"
+	return 0
+    }
+
     set f [open "tmpdir/lookup.out" "w"]
     puts $f $results
     close $f
diff --git a/libctf/testsuite/libctf-regression/open-error-free.c b/libctf/testsuite/libctf-regression/open-error-free.c
index 5e4874444e4..edc5f348d5f 100644
--- a/libctf/testsuite/libctf-regression/open-error-free.c
+++ b/libctf/testsuite/libctf-regression/open-error-free.c
@@ -1,6 +1,7 @@ 
 /* Make sure that, on error, an opened dict is properly freed.  */
 
 #define _GNU_SOURCE 1
+#include "config.h"
 #include <dlfcn.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -8,6 +9,10 @@ 
 #include <ctf-api.h>
 #include <ctf.h>
 
+#ifdef HAVE_VALGRIND_VALGRIND_H
+#include <valgrind/valgrind.h>
+#endif
+
 static unsigned long long malloc_count;
 static unsigned long long free_count;
 
@@ -111,6 +116,14 @@  int main (void)
   ctf_next_t *it = NULL;
   unsigned long long frozen_malloc_count, frozen_free_count;
 
+#ifdef HAVE_VALGRIND_VALGRIND_H
+  if (RUNNING_ON_VALGRIND)
+    {
+      printf ("UNSUPPORTED: valgrind interferes with malloc counting\n");
+      return 0;
+    }
+#endif
+
   if ((fp = ctf_create (&err)) == NULL)
     goto open_err;