summaryrefslogtreecommitdiff
path: root/test/malloc
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2006-02-15 05:30:52 +0000
committerMike Frysinger <vapier@gentoo.org>2006-02-15 05:30:52 +0000
commit909d563a32cd935b02c1d8f8857177e246929874 (patch)
treee6732b7e1f14824dde901759dce9e1a6b8ba82aa /test/malloc
parent85a3c4880f67ad5afeb2a77c43db5b161a16854f (diff)
import tests from glibc
Diffstat (limited to 'test/malloc')
-rw-r--r--test/malloc/tst-calloc.c126
-rw-r--r--test/malloc/tst-malloc.c68
-rw-r--r--test/malloc/tst-mallocfork.c51
-rw-r--r--test/malloc/tst-mcheck.c91
-rw-r--r--test/malloc/tst-obstack.c64
-rw-r--r--test/malloc/tst-valloc.c23
6 files changed, 423 insertions, 0 deletions
diff --git a/test/malloc/tst-calloc.c b/test/malloc/tst-calloc.c
new file mode 100644
index 000000000..b3594c937
--- /dev/null
+++ b/test/malloc/tst-calloc.c
@@ -0,0 +1,126 @@
+/* Copyright (C) 2000, 2002 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>.
+
+ 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <error.h>
+#include <limits.h>
+#include <malloc.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+
+/* Number of samples per size. */
+#define N 50000
+
+
+static void
+fixed_test (int size)
+{
+ char *ptrs[N];
+ int i;
+
+ for (i = 0; i < N; ++i)
+ {
+ int j;
+
+ ptrs[i] = (char *) calloc (1, size);
+
+ if (ptrs[i] == NULL)
+ break;
+
+ for (j = 0; j < size; ++j)
+ {
+ if (ptrs[i][j] != '\0')
+ error (EXIT_FAILURE, 0,
+ "byte not cleared (size %d, element %d, byte %d)",
+ size, i, j);
+ ptrs[i][j] = '\xff';
+ }
+ }
+
+ while (i-- > 0)
+ free (ptrs[i]);
+}
+
+
+static void
+random_test (void)
+{
+ char *ptrs[N];
+ int i;
+
+ for (i = 0; i < N; ++i)
+ {
+ int j;
+ int n = 1 + random () % 10;
+ int elem = 1 + random () % 100;
+ int size = n * elem;
+
+ ptrs[i] = (char *) calloc (n, elem);
+
+ if (ptrs[i] == NULL)
+ break;
+
+ for (j = 0; j < size; ++j)
+ {
+ if (ptrs[i][j] != '\0')
+ error (EXIT_FAILURE, 0,
+ "byte not cleared (size %d, element %d, byte %d)",
+ size, i, j);
+ ptrs[i][j] = '\xff';
+ }
+ }
+
+ while (i-- > 0)
+ free (ptrs[i]);
+}
+
+
+static void
+null_test (void)
+{
+ /* If the size is 0 the result is implementation defined. Just make
+ sure the program doesn't crash. */
+ calloc (0, 0);
+ calloc (0, UINT_MAX);
+ calloc (UINT_MAX, 0);
+ calloc (0, ~((size_t) 0));
+ calloc (~((size_t) 0), 0);
+}
+
+
+int
+main (void)
+{
+ /* We are allocating blocks with `calloc' and check whether every
+ block is completely cleared. We first try this for some fixed
+ times and then with random size. */
+ fixed_test (15);
+ fixed_test (5);
+ fixed_test (17);
+ fixed_test (6);
+ fixed_test (31);
+ fixed_test (96);
+
+ random_test ();
+
+ null_test ();
+
+ return 0;
+}
diff --git a/test/malloc/tst-malloc.c b/test/malloc/tst-malloc.c
new file mode 100644
index 000000000..d555ae46e
--- /dev/null
+++ b/test/malloc/tst-malloc.c
@@ -0,0 +1,68 @@
+/* Copyright (C) 1999 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1999.
+
+ 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <malloc.h>
+#include <stdio.h>
+
+static int errors = 0;
+
+static void
+merror (const char *msg)
+{
+ ++errors;
+ printf ("Error: %s\n", msg);
+}
+
+int
+main (void)
+{
+ void *p;
+ int save;
+
+ errno = 0;
+
+ p = malloc (-1);
+ save = errno;
+
+ if (p != NULL)
+ merror ("malloc (-1) succeeded.");
+
+ if (p == NULL && save != ENOMEM)
+ merror ("errno is not set correctly");
+
+ p = malloc (10);
+ if (p == NULL)
+ merror ("malloc (10) failed.");
+
+ /* realloc (p, 0) == free (p). */
+ p = realloc (p, 0);
+ if (p != NULL)
+ merror ("realloc (p, 0) failed.");
+
+ p = malloc (0);
+ if (p == NULL)
+ merror ("malloc (0) failed.");
+
+ p = realloc (p, 0);
+ if (p != NULL)
+ merror ("realloc (p, 0) failed.");
+
+ return errors != 0;
+}
diff --git a/test/malloc/tst-mallocfork.c b/test/malloc/tst-mallocfork.c
new file mode 100644
index 000000000..f90ce9488
--- /dev/null
+++ b/test/malloc/tst-mallocfork.c
@@ -0,0 +1,51 @@
+/* Derived from the test case in
+ http://sourceware.org/bugzilla/show_bug.cgi?id=838. */
+#include <assert.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+static void
+sig_handler (int signum)
+{
+ pid_t child = fork ();
+ if (child == 0)
+ exit (0);
+ TEMP_FAILURE_RETRY (waitpid (child, NULL, 0));
+}
+
+static int
+do_test (void)
+{
+ pid_t parent = getpid ();
+
+ struct sigaction action = { .sa_handler = sig_handler };
+ sigemptyset (&action.sa_mask);
+
+ malloc (sizeof (int));
+
+ if (sigaction (SIGALRM, &action, NULL) != 0)
+ {
+ puts ("sigaction failed");
+ return 1;
+ }
+
+ /* Create a child that sends the signal to be caught. */
+ pid_t child = fork ();
+ if (child == 0)
+ {
+ if (kill (parent, SIGALRM) == -1)
+ perror ("kill");
+ exit (0);
+ }
+
+ TEMP_FAILURE_RETRY (waitpid (child, NULL, 0));
+
+ return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/test/malloc/tst-mcheck.c b/test/malloc/tst-mcheck.c
new file mode 100644
index 000000000..16784912a
--- /dev/null
+++ b/test/malloc/tst-mcheck.c
@@ -0,0 +1,91 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Jakub Jelinek <jakub@redhat.com>, 2005.
+
+ 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+static int errors = 0;
+
+static void
+merror (const char *msg)
+{
+ ++errors;
+ printf ("Error: %s\n", msg);
+}
+
+int
+main (void)
+{
+ void *p, *q;
+
+ errno = 0;
+
+ p = malloc (-1);
+
+ if (p != NULL)
+ merror ("malloc (-1) succeeded.");
+ else if (errno != ENOMEM)
+ merror ("errno is not set correctly.");
+
+ p = malloc (10);
+ if (p == NULL)
+ merror ("malloc (10) failed.");
+
+ p = realloc (p, 0);
+ if (p != NULL)
+ merror ("realloc (p, 0) failed.");
+
+ p = malloc (0);
+ if (p == NULL)
+ merror ("malloc (0) failed.");
+
+ p = realloc (p, 0);
+ if (p != NULL)
+ merror ("realloc (p, 0) failed.");
+
+ q = malloc (256);
+ if (q == NULL)
+ merror ("malloc (256) failed.");
+
+ p = malloc (512);
+ if (p == NULL)
+ merror ("malloc (512) failed.");
+
+ if (realloc (p, -256) != NULL)
+ merror ("realloc (p, -256) succeeded.");
+ else if (errno != ENOMEM)
+ merror ("errno is not set correctly.");
+
+ free (p);
+
+ p = malloc (512);
+ if (p == NULL)
+ merror ("malloc (512) failed.");
+
+ if (realloc (p, -1) != NULL)
+ merror ("realloc (p, -1) succeeded.");
+ else if (errno != ENOMEM)
+ merror ("errno is not set correctly.");
+
+ free (p);
+ free (q);
+
+ return errors != 0;
+}
diff --git a/test/malloc/tst-obstack.c b/test/malloc/tst-obstack.c
new file mode 100644
index 000000000..769697f18
--- /dev/null
+++ b/test/malloc/tst-obstack.c
@@ -0,0 +1,64 @@
+/* Test case by Alexandre Duret-Lutz <duret_g@epita.fr>. */
+#include <obstack.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define obstack_chunk_alloc verbose_malloc
+#define obstack_chunk_free verbose_free
+#define ALIGN_BOUNDARY 64
+#define ALIGN_MASK (ALIGN_BOUNDARY - 1)
+#define OBJECT_SIZE 1000
+
+static void *
+verbose_malloc (size_t size)
+{
+ void *buf = malloc (size);
+ printf ("malloc (%zu) => %p\n", size, buf);
+ return buf;
+}
+
+static void
+verbose_free (void *buf)
+{
+ free (buf);
+ printf ("free (%p)\n", buf);
+}
+
+int
+main (void)
+{
+ int result = 0;
+ int align = 2;
+
+ while (align <= 64)
+ {
+ struct obstack obs;
+ int i;
+ int align_mask = align - 1;
+
+ printf ("\n Alignment mask: %d\n", align_mask);
+
+ obstack_init (&obs);
+ obstack_alignment_mask (&obs) = align_mask;
+ /* finish an empty object to take alignment into account */
+ obstack_finish (&obs);
+
+ /* let's allocate some objects and print their addresses */
+ for (i = 15; i > 0; --i)
+ {
+ void *obj = obstack_alloc (&obs, OBJECT_SIZE);
+
+ printf ("obstack_alloc (%u) => %p \t%s\n", OBJECT_SIZE, obj,
+ ((uintptr_t) obj & align_mask) ? "(not aligned)" : "");
+ result |= ((uintptr_t) obj & align_mask) != 0;
+ }
+
+ /* clean up */
+ obstack_free (&obs, 0);
+
+ align <<= 1;
+ }
+
+ return result;
+}
diff --git a/test/malloc/tst-valloc.c b/test/malloc/tst-valloc.c
new file mode 100644
index 000000000..643a0dda4
--- /dev/null
+++ b/test/malloc/tst-valloc.c
@@ -0,0 +1,23 @@
+/* Test case by Stephen Tweedie <sct@redhat.com>. */
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main (void)
+{
+ char *p;
+ int pagesize = getpagesize ();
+ int i;
+
+ p = valloc (pagesize);
+ i = (long int) p;
+
+ if ((i & (pagesize-1)) != 0)
+ {
+ fprintf (stderr, "Alignment problem: valloc returns %p\n", p);
+ exit (1);
+ }
+
+ return 0;
+}