@@ -25,6 +25,8 @@
#include <libc-diag.h>
#include <support/check.h>
+#include "tst-malloc-aux.h"
+
static int
do_test (void)
{
@@ -45,28 +47,28 @@ do_test (void)
- A corner case SIZE_MAX / 2 + 1 alignment.
*/
- p1 = aligned_alloc (64, 64);
+ p1 = TEST_ALIGNED_ALLOC (64, 64);
if (p1 == NULL)
FAIL_EXIT1 ("aligned_alloc(64, 64) failed");
- p2 = aligned_alloc (1, 64);
+ p2 = TEST_ALIGNED_ALLOC (1, 64);
if (p2 == NULL)
FAIL_EXIT1 ("aligned_alloc(1, 64) failed");
- p3 = aligned_alloc (65, 64);
+ p3 = TEST_ALIGNED_ALLOC (65, 64);
if (p3 != NULL)
FAIL_EXIT1 ("aligned_alloc(65, 64) did not fail");
- p4 = aligned_alloc (0, 64);
+ p4 = TEST_ALIGNED_ALLOC (0, 64);
if (p4 != NULL)
FAIL_EXIT1 ("aligned_alloc(0, 64) did not fail");
/* This is an alignment like 0x80000000...UL */
- p5 = aligned_alloc (SIZE_MAX / 2 + 1, 64);
+ p5 = TEST_ALIGNED_ALLOC (SIZE_MAX / 2 + 1, 64);
if (p5 != NULL)
FAIL_EXIT1 ("aligned_alloc(SIZE_MAX/2+1, 64) did not fail");
@@ -25,6 +25,8 @@
#include <support/check.h>
#include <support/support.h>
+#include "tst-malloc-aux.h"
+
extern void (*volatile __free_hook) (void *, const void *);
extern void *(*volatile __malloc_hook)(size_t, const void *);
extern void *(*volatile __realloc_hook)(void *, size_t, const void *);
@@ -49,7 +51,7 @@ malloc_called (size_t bytes, const void *address)
{
hook_count++;
__malloc_hook = NULL;
- void *mem = malloc (bytes);
+ void *mem = TEST_MALLOC (bytes);
__malloc_hook = malloc_called;
return mem;
}
@@ -59,7 +61,7 @@ realloc_called (void *oldptr, size_t bytes, const void *address)
{
hook_count++;
__realloc_hook = NULL;
- void *mem = realloc (oldptr, bytes);
+ void *mem = TEST_REALLOC (oldptr, bytes);
__realloc_hook = realloc_called;
return mem;
}
@@ -69,7 +71,7 @@ calloc_called (size_t n, size_t size, const void *address)
{
hook_count++;
__malloc_hook = NULL;
- void *mem = calloc (n, size);
+ void *mem = TEST_CALLOC (n, size);
__malloc_hook = malloc_called;
return mem;
}
@@ -109,15 +111,15 @@ static int
do_test (void)
{
void *p;
- p = malloc (0);
+ p = TEST_MALLOC (0);
TEST_VERIFY_EXIT (p != NULL);
call_count++;
- p = realloc (p, 0);
+ p = TEST_REALLOC (p, 0);
TEST_VERIFY_EXIT (p == NULL);
call_count++;
- p = calloc (512, 1);
+ p = TEST_CALLOC (512, 1);
TEST_VERIFY_EXIT (p != NULL);
call_count++;
new file mode 100644
@@ -0,0 +1,36 @@
+/* Wrappers for malloc-like functions to allow testing the implementation
+ without optimization.
+ 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; see the file COPYING.LIB. If
+ not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef TST_MALLOC_AUX_H
+#define TST_MALLOC_AUX_H
+
+#include <stddef.h>
+#include <stdlib.h>
+
+static void *(*volatile aligned_alloc_indirect)(size_t, size_t) = aligned_alloc;
+static void *(*volatile calloc_indirect)(size_t, size_t) = calloc;
+static void *(*volatile malloc_indirect)(size_t) = malloc;
+static void *(*volatile realloc_indirect)(void*, size_t) = realloc;
+
+#define TEST_ALIGNED_ALLOC aligned_alloc_indirect
+#define TEST_CALLOC calloc_indirect
+#define TEST_MALLOC malloc_indirect
+#define TEST_REALLOC realloc_indirect
+
+#endif /* TST_MALLOC_AUX_H */
@@ -20,6 +20,8 @@
#include <stdlib.h>
#include <libc-diag.h>
+#include "tst-malloc-aux.h"
+
static int errors = 0;
static void
@@ -42,7 +44,7 @@ do_test (void)
that they fail. */
DIAG_IGNORE_NEEDS_COMMENT (7, "-Walloc-size-larger-than=");
#endif
- p = malloc (-1);
+ p = TEST_MALLOC (-1);
DIAG_POP_NEEDS_COMMENT;
if (p != NULL)
@@ -50,27 +52,27 @@ do_test (void)
else if (errno != ENOMEM)
merror ("errno is not set correctly.");
- p = malloc (10);
+ p = TEST_MALLOC (10);
if (p == NULL)
merror ("malloc (10) failed.");
- p = realloc (p, 0);
+ p = TEST_REALLOC (p, 0);
if (p != NULL)
merror ("realloc (p, 0) failed.");
- p = malloc (0);
+ p = TEST_MALLOC (0);
if (p == NULL)
merror ("malloc (0) failed.");
- p = realloc (p, 0);
+ p = TEST_REALLOC (p, 0);
if (p != NULL)
merror ("realloc (p, 0) failed.");
- q = malloc (256);
+ q = TEST_MALLOC (256);
if (q == NULL)
merror ("malloc (256) failed.");
- p = malloc (512);
+ p = TEST_MALLOC (512);
if (p == NULL)
merror ("malloc (512) failed.");
@@ -96,7 +98,7 @@ do_test (void)
DIAG_POP_NEEDS_COMMENT;
#endif
- p = malloc (512);
+ p = TEST_MALLOC (512);
if (p == NULL)
merror ("malloc (512) failed.");
@@ -43,6 +43,7 @@
#include <unistd.h>
#include <sys/param.h>
+#include "tst-malloc-aux.h"
/* This function prepares for each 'too-large memory allocation' test by
performing a small successful malloc/free and resetting errno prior to
@@ -50,7 +51,7 @@
static void
test_setup (void)
{
- void *volatile ptr = malloc (16);
+ void *volatile ptr = TEST_MALLOC (16);
TEST_VERIFY_EXIT (ptr != NULL);
free (ptr);
errno = 0;
@@ -78,19 +79,19 @@ test_large_allocations (size_t size)
that they fail. */
DIAG_IGNORE_NEEDS_COMMENT (7, "-Walloc-size-larger-than=");
#endif
- TEST_VERIFY (malloc (size) == NULL);
+ TEST_VERIFY (TEST_MALLOC (size) == NULL);
#if __GNUC_PREREQ (7, 0)
DIAG_POP_NEEDS_COMMENT;
#endif
TEST_VERIFY (errno == ENOMEM);
- ptr_to_realloc = malloc (16);
+ ptr_to_realloc = TEST_MALLOC (16);
TEST_VERIFY_EXIT (ptr_to_realloc != NULL);
test_setup ();
#if __GNUC_PREREQ (7, 0)
DIAG_IGNORE_NEEDS_COMMENT (7, "-Walloc-size-larger-than=");
#endif
- TEST_VERIFY (realloc (ptr_to_realloc, size) == NULL);
+ TEST_VERIFY (TEST_REALLOC (ptr_to_realloc, size) == NULL);
#if __GNUC_PREREQ (7, 0)
DIAG_POP_NEEDS_COMMENT;
#endif
@@ -109,14 +110,14 @@ test_large_allocations (size_t size)
if ((size % nmemb) == 0)
{
test_setup ();
- TEST_VERIFY (calloc (nmemb, size / nmemb) == NULL);
+ TEST_VERIFY (TEST_CALLOC (nmemb, size / nmemb) == NULL);
TEST_VERIFY (errno == ENOMEM);
test_setup ();
- TEST_VERIFY (calloc (size / nmemb, nmemb) == NULL);
+ TEST_VERIFY (TEST_CALLOC (size / nmemb, nmemb) == NULL);
TEST_VERIFY (errno == ENOMEM);
- ptr_to_realloc = malloc (16);
+ ptr_to_realloc = TEST_MALLOC (16);
TEST_VERIFY_EXIT (ptr_to_realloc != NULL);
test_setup ();
TEST_VERIFY (reallocarray (ptr_to_realloc, nmemb, size / nmemb) == NULL);
@@ -131,7 +132,7 @@ test_large_allocations (size_t size)
DIAG_POP_NEEDS_COMMENT;
#endif
- ptr_to_realloc = malloc (16);
+ ptr_to_realloc = TEST_MALLOC (16);
TEST_VERIFY_EXIT (ptr_to_realloc != NULL);
test_setup ();
TEST_VERIFY (reallocarray (ptr_to_realloc, size / nmemb, nmemb) == NULL);
@@ -199,7 +200,7 @@ test_large_aligned_allocations (size_t size)
#if __GNUC_PREREQ (7, 0)
DIAG_IGNORE_NEEDS_COMMENT (7, "-Walloc-size-larger-than=");
#endif
- TEST_VERIFY (aligned_alloc (align, size) == NULL);
+ TEST_VERIFY (TEST_ALIGNED_ALLOC (align, size) == NULL);
#if __GNUC_PREREQ (7, 0)
DIAG_POP_NEEDS_COMMENT;
#endif
@@ -22,6 +22,8 @@
#include <libc-diag.h>
#include <time.h>
+#include "tst-malloc-aux.h"
+
static int errors = 0;
static void
@@ -47,7 +49,7 @@ do_test (void)
that they fail. */
DIAG_IGNORE_NEEDS_COMMENT (7, "-Walloc-size-larger-than=");
#endif
- p = malloc (-1);
+ p = TEST_MALLOC (-1);
DIAG_POP_NEEDS_COMMENT;
save = errno;
@@ -57,24 +59,24 @@ do_test (void)
if (p == NULL && save != ENOMEM)
merror ("errno is not set correctly");
- p = malloc (10);
+ p = TEST_MALLOC (10);
if (p == NULL)
merror ("malloc (10) failed.");
/* realloc (p, 0) == free (p). */
- p = realloc (p, 0);
+ p = TEST_REALLOC (p, 0);
if (p != NULL)
merror ("realloc (p, 0) failed.");
- p = malloc (0);
+ p = TEST_MALLOC (0);
if (p == NULL)
merror ("malloc (0) failed.");
- p = realloc (p, 0);
+ p = TEST_REALLOC (p, 0);
if (p != NULL)
merror ("realloc (p, 0) failed.");
- p = malloc (513 * 1024);
+ p = TEST_MALLOC (513 * 1024);
if (p == NULL)
merror ("malloc (513K) failed.");
@@ -84,7 +86,7 @@ do_test (void)
that they fail. */
DIAG_IGNORE_NEEDS_COMMENT (7, "-Walloc-size-larger-than=");
#endif
- q = malloc (-512 * 1024);
+ q = TEST_MALLOC (-512 * 1024);
DIAG_POP_NEEDS_COMMENT;
if (q != NULL)
merror ("malloc (-512K) succeeded.");
@@ -23,6 +23,8 @@
#include <libc-diag.h>
#include <support/check.h>
+#include "tst-malloc-aux.h"
+
static int
do_test (void)
{
@@ -39,7 +41,7 @@ do_test (void)
that they fail. */
DIAG_IGNORE_NEEDS_COMMENT (7, "-Walloc-size-larger-than=");
#endif
- p = realloc (NULL, -1);
+ p = TEST_REALLOC (NULL, -1);
DIAG_POP_NEEDS_COMMENT;
save = errno;
@@ -53,7 +55,7 @@ do_test (void)
errno = 0;
/* realloc (NULL, ...) behaves similarly to malloc (C89). */
- p = realloc (NULL, 10);
+ p = TEST_REALLOC (NULL, 10);
save = errno;
if (p == NULL)
@@ -61,12 +63,12 @@ do_test (void)
free (p);
- p = calloc (20, 1);
+ p = TEST_CALLOC (20, 1);
if (p == NULL)
FAIL_EXIT1 ("calloc (20, 1) failed.");
/* Check increasing size preserves contents (C89). */
- p = realloc (p, 200);
+ p = TEST_REALLOC (p, 200);
if (p == NULL)
FAIL_EXIT1 ("realloc (p, 200) failed.");
@@ -84,14 +86,14 @@ do_test (void)
free (p);
- p = realloc (NULL, 100);
+ p = TEST_REALLOC (NULL, 100);
if (p == NULL)
FAIL_EXIT1 ("realloc (NULL, 100) failed.");
memset (p, 0xff, 100);
/* Check decreasing size preserves contents (C89). */
- p = realloc (p, 16);
+ p = TEST_REALLOC (p, 16);
if (p == NULL)
FAIL_EXIT1 ("realloc (p, 16) failed.");
@@ -114,7 +116,7 @@ do_test (void)
that they fail. */
DIAG_IGNORE_NEEDS_COMMENT (7, "-Walloc-size-larger-than=");
#endif
- c = realloc (p, -1);
+ c = TEST_REALLOC (p, -1);
DIAG_POP_NEEDS_COMMENT;
if (c != NULL)
FAIL_EXIT1 ("realloc (p, -1) succeeded.");
@@ -132,12 +134,12 @@ do_test (void)
FAIL_EXIT1 ("first 16 bytes were not correct after failed realloc");
/* realloc (p, 0) frees p (C89) and returns NULL (glibc). */
- p = realloc (p, 0);
+ p = TEST_REALLOC (p, 0);
if (p != NULL)
FAIL_EXIT1 ("realloc (p, 0) returned non-NULL.");
/* realloc (NULL, 0) acts like malloc (0) (glibc). */
- p = realloc (NULL, 0);
+ p = TEST_REALLOC (NULL, 0);
if (p == NULL)
FAIL_EXIT1 ("realloc (NULL, 0) returned NULL.");
@@ -147,14 +149,14 @@ do_test (void)
space to expand in the chunk. */
for (size_t sz = 3; sz < 256 * 1024; sz += 2048)
{
- p = realloc (NULL, sz);
+ p = TEST_REALLOC (NULL, sz);
if (p == NULL)
FAIL_EXIT1 ("realloc (NULL, %zu) returned NULL.", sz);
size_t newsz = malloc_usable_size (p);
printf ("size: %zu, usable size: %zu, extra: %zu\n",
sz, newsz, newsz - sz);
uintptr_t oldp = (uintptr_t) p;
- void *new_p = realloc (p, newsz);
+ void *new_p = TEST_REALLOC (p, newsz);
if ((uintptr_t) new_p != oldp)
FAIL_EXIT1 ("Expanding (%zu bytes) to usable size (%zu) moved block",
sz, newsz);