diff options
| -rw-r--r-- | test/malloc/tst-calloc.c | 126 | ||||
| -rw-r--r-- | test/malloc/tst-malloc.c | 68 | ||||
| -rw-r--r-- | test/malloc/tst-mallocfork.c | 51 | ||||
| -rw-r--r-- | test/malloc/tst-mcheck.c | 91 | ||||
| -rw-r--r-- | test/malloc/tst-obstack.c | 64 | ||||
| -rw-r--r-- | test/malloc/tst-valloc.c | 23 | 
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; +}  | 
