aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--malloc/Makefile12
-rw-r--r--malloc/tst-aligned-alloc-random.c43
-rw-r--r--malloc/tst-aligned_alloc-lib.c72
-rw-r--r--malloc/tst-malloc-random.c20
-rw-r--r--malloc/tst-malloc.c4
5 files changed, 151 insertions, 0 deletions
diff --git a/malloc/Makefile b/malloc/Makefile
index 77ba1a9..c1a03f3 100644
--- a/malloc/Makefile
+++ b/malloc/Makefile
@@ -27,6 +27,7 @@ headers := $(dist-headers) obstack.h mcheck.h
tests := \
mallocbug \
tst-aligned-alloc \
+ tst-aligned-alloc-random \
tst-alloc_buffer \
tst-calloc \
tst-free-errno \
@@ -36,6 +37,7 @@ tests := \
tst-malloc-backtrace \
tst-malloc-check \
tst-malloc-fork-deadlock \
+ tst-malloc-random \
tst-malloc-stats-cancellation \
tst-malloc-tcache-leak \
tst-malloc-thread-exit \
@@ -193,6 +195,7 @@ extra-libs-others = $(extra-libs)
# Helper objects for some tests.
extra-test-objs += \
+ tst-aligned_alloc-lib.so \
tst-interpose-aux-nothread.o \
tst-interpose-aux-thread.o \
# extra-test-objs
@@ -202,6 +205,9 @@ test-extras = \
tst-interpose-aux-thread \
# test-extras
+modules-names = \
+ tst-aligned_alloc-lib
+
libmemusage-routines = memusage
libmemusage-inhibit-o = $(filter-out .os,$(object-suffixes))
@@ -408,3 +414,9 @@ tst-mallocstate-malloc-check-ENV = LD_PRELOAD=$(objpfx)libc_malloc_debug.so
# libc_malloc_debug.so.
$(objpfx)tst-mallocstate: $(objpfx)libc_malloc_debug.so
$(objpfx)tst-mallocstate-malloc-check: $(objpfx)libc_malloc_debug.so
+
+$(objpfx)tst-aligned-alloc-random.out: $(objpfx)tst-aligned_alloc-lib.so
+$(objpfx)tst-malloc-random.out: $(objpfx)tst-aligned_alloc-lib.so
+
+tst-aligned-alloc-random-ENV = LD_PRELOAD=$(objpfx)tst-aligned_alloc-lib.so
+tst-malloc-random-ENV = LD_PRELOAD=$(objpfx)tst-aligned_alloc-lib.so
diff --git a/malloc/tst-aligned-alloc-random.c b/malloc/tst-aligned-alloc-random.c
new file mode 100644
index 0000000..f2825ce
--- /dev/null
+++ b/malloc/tst-aligned-alloc-random.c
@@ -0,0 +1,43 @@
+/* Test for randomized malloc that calls aligned_alloc
+ Copyright (C) 2024 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <stdlib.h>
+#include <support/check.h>
+#include <time.h>
+
+static int
+do_test (void)
+{
+ void *p1;
+ int i;
+
+ srandom (time (NULL));
+
+ for (i = 0; i < 1024; i++)
+ {
+ size_t size = random () & 0xffff;
+
+ p1 = malloc (size);
+ TEST_VERIFY (p1 != NULL);
+ }
+
+ return 0;
+}
+
+
+#include <support/test-driver.c>
diff --git a/malloc/tst-aligned_alloc-lib.c b/malloc/tst-aligned_alloc-lib.c
new file mode 100644
index 0000000..0205df5
--- /dev/null
+++ b/malloc/tst-aligned_alloc-lib.c
@@ -0,0 +1,72 @@
+/* Module used for improved aligned_alloc testing.
+ Copyright (C) 2024 Free Software Foundation, Inc.
+ Copyright The GNU Toolchain Authors.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If
+ not, see <https://www.gnu.org/licenses/>. */
+
+#include <array_length.h>
+#include <libc-symbols.h>
+#include <stdlib.h>
+
+extern void *__libc_malloc (size_t size);
+extern void *__libc_calloc (size_t n, size_t size);
+
+int aligned_alloc_count = 0;
+int libc_malloc_count = 0;
+int libc_calloc_count = 0;
+
+/* Get a random alignment value. Biased towards the smaller values. Must be
+ a power of 2. */
+static size_t get_random_alignment (void)
+{
+ size_t aligns[] = {
+ 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384
+ };
+
+ return aligns[random () % array_length (aligns)];
+}
+
+static void *get_random_alloc (size_t size)
+{
+ void *retval;
+ size_t align;
+
+ switch (random() % 3)
+ {
+ case 1:
+ align = get_random_alignment ();
+ retval = aligned_alloc (align, size);
+ aligned_alloc_count++;
+ break;
+ case 2:
+ retval = __libc_calloc (1, size);
+ libc_calloc_count++;
+ break;
+ default:
+ retval = __libc_malloc (size);
+ libc_malloc_count++;
+ break;
+ }
+
+ return retval;
+}
+
+
+void * __random_malloc (size_t size)
+{
+ return get_random_alloc (size);
+}
+strong_alias (__random_malloc, malloc)
diff --git a/malloc/tst-malloc-random.c b/malloc/tst-malloc-random.c
new file mode 100644
index 0000000..762b70c
--- /dev/null
+++ b/malloc/tst-malloc-random.c
@@ -0,0 +1,20 @@
+/* Test malloc with random calls to aligned_alloc and calloc.
+
+ Copyright (C) 2024 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include "tst-malloc.c"
diff --git a/malloc/tst-malloc.c b/malloc/tst-malloc.c
index a7491d3..f7a6e46 100644
--- a/malloc/tst-malloc.c
+++ b/malloc/tst-malloc.c
@@ -18,7 +18,9 @@
#include <errno.h>
#include <malloc.h>
#include <stdio.h>
+#include <stdlib.h>
#include <libc-diag.h>
+#include <time.h>
static int errors = 0;
@@ -35,6 +37,8 @@ do_test (void)
void *p, *q;
int save;
+ srandom (time (NULL));
+
errno = 0;
DIAG_PUSH_NEEDS_COMMENT;