diff --git a/malloc/Makefile b/malloc/Makefile index 77ba1a9109..c1a03f3cb0 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 0000000000..f2825ce38f --- /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 + . */ + +#include +#include +#include + +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 diff --git a/malloc/tst-aligned_alloc-lib.c b/malloc/tst-aligned_alloc-lib.c new file mode 100644 index 0000000000..0205df5acf --- /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 . */ + +#include +#include +#include + +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 0000000000..762b70c918 --- /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 + . */ + +#include "tst-malloc.c" diff --git a/malloc/tst-malloc.c b/malloc/tst-malloc.c index a7491d3d00..f7a6e4654c 100644 --- a/malloc/tst-malloc.c +++ b/malloc/tst-malloc.c @@ -18,7 +18,9 @@ #include #include #include +#include #include +#include 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;