Add mcheck tests to malloc

Message ID 20210622130746.761980-1-siddhesh@sourceware.org
State Superseded
Headers
Series Add mcheck tests to malloc |

Checks

Context Check Description
dj/TryBot-apply_patch fail Patch failed to apply to master at the time it was sent

Commit Message

Siddhesh Poyarekar June 22, 2021, 1:07 p.m. UTC
  Like malloc-check, add generic rules to run all tests in malloc by
linking with libmcheck.a so as to provide coverage for mcheck().
Currently the following 12 tests fail:

FAIL: malloc/tst-malloc-backtrace-mcheck
FAIL: malloc/tst-malloc-fork-deadlock-mcheck
FAIL: malloc/tst-malloc-stats-cancellation-mcheck
FAIL: malloc/tst-malloc-tcache-leak-mcheck
FAIL: malloc/tst-malloc-thread-exit-mcheck
FAIL: malloc/tst-malloc-thread-fail-mcheck
FAIL: malloc/tst-malloc-usable-static-mcheck
FAIL: malloc/tst-malloc-usable-static-tunables-mcheck
FAIL: malloc/tst-malloc-usable-tunables-mcheck
FAIL: malloc/tst-malloc_info-mcheck
FAIL: malloc/tst-memalign-mcheck
FAIL: malloc/tst-posix_memalign-mcheck

and they have been added to tests-exclude-mcheck for now to keep
status quo.  At least the last two can be attributed to bugs in
mcheck() but I haven't fixed them here since they should be fixed by
removing malloc hooks.  Others need to be triaged to check if they're
due to mcheck bugs or due to actual bugs.
---

This patch relies on the refactoring in:
https://patchwork.sourceware.org/project/glibc/patch/20210622102013.2807141-1-siddhesh@sourceware.org/

 Rules           | 15 ++++++++++++++-
 malloc/Makefile | 35 +++++++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+), 1 deletion(-)
  

Comments

Siddhesh Poyarekar June 23, 2021, 2:04 p.m. UTC | #1
On 6/22/21 6:37 PM, Siddhesh Poyarekar via Libc-alpha wrote:
> Like malloc-check, add generic rules to run all tests in malloc by
> linking with libmcheck.a so as to provide coverage for mcheck().
> Currently the following 12 tests fail:
> 
> FAIL: malloc/tst-malloc-backtrace-mcheck
> FAIL: malloc/tst-malloc-fork-deadlock-mcheck
> FAIL: malloc/tst-malloc-stats-cancellation-mcheck
> FAIL: malloc/tst-malloc-tcache-leak-mcheck
> FAIL: malloc/tst-malloc-thread-exit-mcheck
> FAIL: malloc/tst-malloc-thread-fail-mcheck
> FAIL: malloc/tst-malloc-usable-static-mcheck
> FAIL: malloc/tst-malloc-usable-static-tunables-mcheck
> FAIL: malloc/tst-malloc-usable-tunables-mcheck
> FAIL: malloc/tst-malloc_info-mcheck
> FAIL: malloc/tst-memalign-mcheck
> FAIL: malloc/tst-posix_memalign-mcheck

I took a closer look at these and barring the memalign tests (which are 
bugs in mcheck()) they all either are multi-threaded (and hence unsafe 
for mcheck usage) or expect glibc malloc-specific results that mcheck() 
modifies.

I'll be fixing mcheck failures as part of the malloc hooks removal.

Siddhesh
  
Siddhesh Poyarekar June 28, 2021, 8:39 a.m. UTC | #2
On 6/22/21 6:37 PM, Siddhesh Poyarekar via Libc-alpha wrote:
> Like malloc-check, add generic rules to run all tests in malloc by
> linking with libmcheck.a so as to provide coverage for mcheck().
> Currently the following 12 tests fail:
> 
> FAIL: malloc/tst-malloc-backtrace-mcheck
> FAIL: malloc/tst-malloc-fork-deadlock-mcheck
> FAIL: malloc/tst-malloc-stats-cancellation-mcheck
> FAIL: malloc/tst-malloc-tcache-leak-mcheck
> FAIL: malloc/tst-malloc-thread-exit-mcheck
> FAIL: malloc/tst-malloc-thread-fail-mcheck
> FAIL: malloc/tst-malloc-usable-static-mcheck
> FAIL: malloc/tst-malloc-usable-static-tunables-mcheck
> FAIL: malloc/tst-malloc-usable-tunables-mcheck
> FAIL: malloc/tst-malloc_info-mcheck
> FAIL: malloc/tst-memalign-mcheck
> FAIL: malloc/tst-posix_memalign-mcheck
> 
> and they have been added to tests-exclude-mcheck for now to keep
> status quo.  At least the last two can be attributed to bugs in
> mcheck() but I haven't fixed them here since they should be fixed by
> removing malloc hooks.  Others need to be triaged to check if they're
> due to mcheck bugs or due to actual bugs.
> ---
> 
> This patch relies on the refactoring in:
> https://patchwork.sourceware.org/project/glibc/patch/20210622102013.2807141-1-siddhesh@sourceware.org/
> 
>   Rules           | 15 ++++++++++++++-
>   malloc/Makefile | 35 +++++++++++++++++++++++++++++++++++
>   2 files changed, 49 insertions(+), 1 deletion(-)
> 
> diff --git a/Rules b/Rules
> index c6b635c3f7..ba13598df6 100644
> --- a/Rules
> +++ b/Rules
> @@ -155,6 +155,7 @@ xtests: tests $(xtests-special)
>   else
>   tests: $(tests:%=$(objpfx)%.out) $(tests-internal:%=$(objpfx)%.out) \
>          $(tests-container:%=$(objpfx)%.out) \
> +       $(tests-mcheck:%=$(objpfx)%-mcheck.out) \
>          $(tests-malloc-check:%=$(objpfx)%-malloc-check.out) \
>          $(tests-special) $(tests-printers-out)
>   xtests: tests $(xtests:%=$(objpfx)%.out) $(xtests-special)
> @@ -166,7 +167,8 @@ ifeq ($(run-built-tests),no)
>   tests-expected =
>   else
>   tests-expected = $(tests) $(tests-internal) $(tests-printers) \
> -	$(tests-container) $(tests-malloc-check:%=%-malloc-check)
> +	$(tests-container) $(tests-malloc-check:%=%-malloc-check) \
> +	$(tests-mcheck:%=%-mcheck)
>   endif
>   tests:
>   	$(..)scripts/merge-test-results.sh -s $(objpfx) $(subdir) \
> @@ -192,6 +194,7 @@ else
>   binaries-pie-tests =
>   binaries-pie-notests =
>   endif
> +binaries-mcheck-tests = $(tests-mcheck:%=%-mcheck)
>   binaries-malloc-check-tests = $(tests-malloc-check:%=%-malloc-check)
>   else
>   binaries-all-notests =
> @@ -202,6 +205,7 @@ binaries-static-tests =
>   binaries-static =
>   binaries-pie-tests =
>   binaries-pie-notests =
> +binaries-mcheck-tests =
>   binaries-malloc-check-tests =
>   endif
>   
> @@ -226,6 +230,15 @@ $(addprefix $(objpfx),$(binaries-shared-tests)): %: %.o \
>   	$(+link-tests)
>   endif
>   
> +ifneq "$(strip $(binaries-mcheck-tests))" ""
> +$(addprefix $(objpfx),$(binaries-mcheck-tests)): %-mcheck: %.o \
> +  $(link-extra-libs-tests) \
> +  $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
> +  $(common-objpfx)malloc/libmcheck.a \
> +  $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
> +	$(+link-tests)
> +endif
> +
>   ifneq "$(strip $(binaries-malloc-check-tests))" ""
>   $(addprefix $(objpfx),$(binaries-malloc-check-tests)): %-malloc-check: %.o \
>     $(link-extra-libs-tests) \
> diff --git a/malloc/Makefile b/malloc/Makefile
> index 3162301fba..fd7f399250 100644
> --- a/malloc/Makefile
> +++ b/malloc/Makefile
> @@ -76,6 +76,26 @@ tests-exclude-malloc-check = tst-malloc-check tst-malloc-usable \
>   # Run all tests with MALLOC_CHECK_=3
>   tests-malloc-check = $(filter-out $(tests-exclude-malloc-check),$(tests))
>   
> +# Tests that don't play well with mcheck.  They are either bugs in mcheck or
> +# the tests expect specific internal behavior that is changed due to linking to
> +# libmcheck.a.
> +tests-exclude-mcheck = tst-mallocstate \
> +	tst-safe-linking tst-malloc-usable \
> +	tst-malloc-backtrace \
> +	tst-malloc-fork-deadlock \
> +	tst-malloc-stats-cancellation \
> +	tst-malloc-tcache-leak \
> +	tst-malloc-thread-exit \
> +	tst-malloc-thread-fail \
> +	tst-malloc-usable-static \
> +	tst-malloc-usable-static-tunables \
> +	tst-malloc-usable-tunables \
> +	tst-malloc_info \
> +	tst-memalign \
> +	tst-posix_memalign
> +
> +tests-mcheck = $(filter-out $(tests-exclude-mcheck), $(tests))
> +
>   routines = malloc morecore mcheck mtrace obstack reallocarray \
>     scratch_buffer_dupfree \
>     scratch_buffer_grow scratch_buffer_grow_preserve \
> @@ -115,6 +135,11 @@ $(objpfx)tst-malloc-thread-exit: $(shared-thread-library)
>   $(objpfx)tst-malloc-thread-fail: $(shared-thread-library)
>   $(objpfx)tst-malloc-fork-deadlock: $(shared-thread-library)
>   $(objpfx)tst-malloc-stats-cancellation: $(shared-thread-library)
> +$(objpfx)tst-malloc-backtrace-mcheck: $(shared-thread-library)
> +$(objpfx)tst-malloc-thread-exit-mcheck: $(shared-thread-library)
> +$(objpfx)tst-malloc-thread-fail-mcheck: $(shared-thread-library)
> +$(objpfx)tst-malloc-fork-deadlock-mcheck: $(shared-thread-library)
> +$(objpfx)tst-malloc-stats-cancellation-mcheck: $(shared-thread-library)
>   $(objpfx)tst-malloc-backtrace-malloc-check: $(shared-thread-library)
>   $(objpfx)tst-malloc-thread-exit-malloc-check: $(shared-thread-library)
>   $(objpfx)tst-malloc-thread-fail-malloc-check: $(shared-thread-library)
> @@ -250,17 +275,24 @@ $(foreach o,$(all-object-suffixes),$(objpfx)malloc$(o)): arena.c hooks.c
>   $(tests:%=$(objpfx)%.o): CPPFLAGS += -DTEST_NO_MALLOPT
>   
>   $(objpfx)tst-interpose-nothread: $(objpfx)tst-interpose-aux-nothread.o
> +$(objpfx)tst-interpose-nothread-mcheck: $(objpfx)tst-interpose-aux-nothread.o
>   $(objpfx)tst-interpose-nothread-malloc-check: \
>   	$(objpfx)tst-interpose-aux-nothread.o
>   $(objpfx)tst-interpose-thread: \
>     $(objpfx)tst-interpose-aux-thread.o $(shared-thread-library)
> +$(objpfx)tst-interpose-thread-mcheck: \
> +  $(objpfx)tst-interpose-aux-thread.o $(shared-thread-library)
>   $(objpfx)tst-interpose-thread-malloc-check: \
>     $(objpfx)tst-interpose-aux-thread.o $(shared-thread-library)
>   $(objpfx)tst-interpose-static-nothread: $(objpfx)tst-interpose-aux-nothread.o
> +$(objpfx)tst-interpose-static-nothread-mcheck: \
> +	$(objpfx)tst-interpose-aux-nothread.o
>   $(objpfx)tst-interpose-static-nothread-malloc-check: \
>   	$(objpfx)tst-interpose-aux-nothread.o
>   $(objpfx)tst-interpose-static-thread: \
>     $(objpfx)tst-interpose-aux-thread.o $(static-thread-library)
> +$(objpfx)tst-interpose-static-thread-mcheck: \
> +  $(objpfx)tst-interpose-aux-thread.o $(static-thread-library)
>   $(objpfx)tst-interpose-static-thread-malloc-check: \
>     $(objpfx)tst-interpose-aux-thread.o $(static-thread-library)
>   
> @@ -277,6 +309,9 @@ $(objpfx)tst-dynarray-fail-mem.out: $(objpfx)tst-dynarray-fail.out
>   $(objpfx)tst-malloc-tcache-leak: $(shared-thread-library)
>   $(objpfx)tst-malloc_info: $(shared-thread-library)
>   $(objpfx)tst-mallocfork2: $(shared-thread-library)
> +$(objpfx)tst-malloc-tcache-leak-mcheck: $(shared-thread-library)
> +$(objpfx)tst-malloc_info-mcheck: $(shared-thread-library)
> +$(objpfx)tst-mallocfork2-mcheck: $(shared-thread-library)
>   $(objpfx)tst-malloc-tcache-leak-malloc-check: $(shared-thread-library)
>   $(objpfx)tst-malloc_info-malloc-check: $(shared-thread-library)
>   $(objpfx)tst-mallocfork2-malloc-check: $(shared-thread-library)
>
  

Patch

diff --git a/Rules b/Rules
index c6b635c3f7..ba13598df6 100644
--- a/Rules
+++ b/Rules
@@ -155,6 +155,7 @@  xtests: tests $(xtests-special)
 else
 tests: $(tests:%=$(objpfx)%.out) $(tests-internal:%=$(objpfx)%.out) \
        $(tests-container:%=$(objpfx)%.out) \
+       $(tests-mcheck:%=$(objpfx)%-mcheck.out) \
        $(tests-malloc-check:%=$(objpfx)%-malloc-check.out) \
        $(tests-special) $(tests-printers-out)
 xtests: tests $(xtests:%=$(objpfx)%.out) $(xtests-special)
@@ -166,7 +167,8 @@  ifeq ($(run-built-tests),no)
 tests-expected =
 else
 tests-expected = $(tests) $(tests-internal) $(tests-printers) \
-	$(tests-container) $(tests-malloc-check:%=%-malloc-check)
+	$(tests-container) $(tests-malloc-check:%=%-malloc-check) \
+	$(tests-mcheck:%=%-mcheck)
 endif
 tests:
 	$(..)scripts/merge-test-results.sh -s $(objpfx) $(subdir) \
@@ -192,6 +194,7 @@  else
 binaries-pie-tests =
 binaries-pie-notests =
 endif
+binaries-mcheck-tests = $(tests-mcheck:%=%-mcheck)
 binaries-malloc-check-tests = $(tests-malloc-check:%=%-malloc-check)
 else
 binaries-all-notests =
@@ -202,6 +205,7 @@  binaries-static-tests =
 binaries-static =
 binaries-pie-tests =
 binaries-pie-notests =
+binaries-mcheck-tests =
 binaries-malloc-check-tests =
 endif
 
@@ -226,6 +230,15 @@  $(addprefix $(objpfx),$(binaries-shared-tests)): %: %.o \
 	$(+link-tests)
 endif
 
+ifneq "$(strip $(binaries-mcheck-tests))" ""
+$(addprefix $(objpfx),$(binaries-mcheck-tests)): %-mcheck: %.o \
+  $(link-extra-libs-tests) \
+  $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
+  $(common-objpfx)malloc/libmcheck.a \
+  $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
+	$(+link-tests)
+endif
+
 ifneq "$(strip $(binaries-malloc-check-tests))" ""
 $(addprefix $(objpfx),$(binaries-malloc-check-tests)): %-malloc-check: %.o \
   $(link-extra-libs-tests) \
diff --git a/malloc/Makefile b/malloc/Makefile
index 3162301fba..fd7f399250 100644
--- a/malloc/Makefile
+++ b/malloc/Makefile
@@ -76,6 +76,26 @@  tests-exclude-malloc-check = tst-malloc-check tst-malloc-usable \
 # Run all tests with MALLOC_CHECK_=3
 tests-malloc-check = $(filter-out $(tests-exclude-malloc-check),$(tests))
 
+# Tests that don't play well with mcheck.  They are either bugs in mcheck or
+# the tests expect specific internal behavior that is changed due to linking to
+# libmcheck.a.
+tests-exclude-mcheck = tst-mallocstate \
+	tst-safe-linking tst-malloc-usable \
+	tst-malloc-backtrace \
+	tst-malloc-fork-deadlock \
+	tst-malloc-stats-cancellation \
+	tst-malloc-tcache-leak \
+	tst-malloc-thread-exit \
+	tst-malloc-thread-fail \
+	tst-malloc-usable-static \
+	tst-malloc-usable-static-tunables \
+	tst-malloc-usable-tunables \
+	tst-malloc_info \
+	tst-memalign \
+	tst-posix_memalign
+
+tests-mcheck = $(filter-out $(tests-exclude-mcheck), $(tests))
+
 routines = malloc morecore mcheck mtrace obstack reallocarray \
   scratch_buffer_dupfree \
   scratch_buffer_grow scratch_buffer_grow_preserve \
@@ -115,6 +135,11 @@  $(objpfx)tst-malloc-thread-exit: $(shared-thread-library)
 $(objpfx)tst-malloc-thread-fail: $(shared-thread-library)
 $(objpfx)tst-malloc-fork-deadlock: $(shared-thread-library)
 $(objpfx)tst-malloc-stats-cancellation: $(shared-thread-library)
+$(objpfx)tst-malloc-backtrace-mcheck: $(shared-thread-library)
+$(objpfx)tst-malloc-thread-exit-mcheck: $(shared-thread-library)
+$(objpfx)tst-malloc-thread-fail-mcheck: $(shared-thread-library)
+$(objpfx)tst-malloc-fork-deadlock-mcheck: $(shared-thread-library)
+$(objpfx)tst-malloc-stats-cancellation-mcheck: $(shared-thread-library)
 $(objpfx)tst-malloc-backtrace-malloc-check: $(shared-thread-library)
 $(objpfx)tst-malloc-thread-exit-malloc-check: $(shared-thread-library)
 $(objpfx)tst-malloc-thread-fail-malloc-check: $(shared-thread-library)
@@ -250,17 +275,24 @@  $(foreach o,$(all-object-suffixes),$(objpfx)malloc$(o)): arena.c hooks.c
 $(tests:%=$(objpfx)%.o): CPPFLAGS += -DTEST_NO_MALLOPT
 
 $(objpfx)tst-interpose-nothread: $(objpfx)tst-interpose-aux-nothread.o
+$(objpfx)tst-interpose-nothread-mcheck: $(objpfx)tst-interpose-aux-nothread.o
 $(objpfx)tst-interpose-nothread-malloc-check: \
 	$(objpfx)tst-interpose-aux-nothread.o
 $(objpfx)tst-interpose-thread: \
   $(objpfx)tst-interpose-aux-thread.o $(shared-thread-library)
+$(objpfx)tst-interpose-thread-mcheck: \
+  $(objpfx)tst-interpose-aux-thread.o $(shared-thread-library)
 $(objpfx)tst-interpose-thread-malloc-check: \
   $(objpfx)tst-interpose-aux-thread.o $(shared-thread-library)
 $(objpfx)tst-interpose-static-nothread: $(objpfx)tst-interpose-aux-nothread.o
+$(objpfx)tst-interpose-static-nothread-mcheck: \
+	$(objpfx)tst-interpose-aux-nothread.o
 $(objpfx)tst-interpose-static-nothread-malloc-check: \
 	$(objpfx)tst-interpose-aux-nothread.o
 $(objpfx)tst-interpose-static-thread: \
   $(objpfx)tst-interpose-aux-thread.o $(static-thread-library)
+$(objpfx)tst-interpose-static-thread-mcheck: \
+  $(objpfx)tst-interpose-aux-thread.o $(static-thread-library)
 $(objpfx)tst-interpose-static-thread-malloc-check: \
   $(objpfx)tst-interpose-aux-thread.o $(static-thread-library)
 
@@ -277,6 +309,9 @@  $(objpfx)tst-dynarray-fail-mem.out: $(objpfx)tst-dynarray-fail.out
 $(objpfx)tst-malloc-tcache-leak: $(shared-thread-library)
 $(objpfx)tst-malloc_info: $(shared-thread-library)
 $(objpfx)tst-mallocfork2: $(shared-thread-library)
+$(objpfx)tst-malloc-tcache-leak-mcheck: $(shared-thread-library)
+$(objpfx)tst-malloc_info-mcheck: $(shared-thread-library)
+$(objpfx)tst-mallocfork2-mcheck: $(shared-thread-library)
 $(objpfx)tst-malloc-tcache-leak-malloc-check: $(shared-thread-library)
 $(objpfx)tst-malloc_info-malloc-check: $(shared-thread-library)
 $(objpfx)tst-mallocfork2-malloc-check: $(shared-thread-library)