malloc: Add mallopt test.

Message ID 1396953264-6020-1-git-send-email-will.newton@linaro.org
State Committed
Headers

Commit Message

Will Newton April 8, 2014, 10:34 a.m. UTC
  ChangeLog:

2014-04-08  Will Newton  <will.newton@linaro.org>

    * malloc/Makefile (tests): Add tst-mallopt.
    * malloc/tst-mallopt.c: New file.
---
 malloc/Makefile      |  2 +-
 malloc/tst-mallopt.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 76 insertions(+), 1 deletion(-)
 create mode 100644 malloc/tst-mallopt.c
  

Comments

Will Newton May 1, 2014, 7:54 a.m. UTC | #1
On 8 April 2014 11:34, Will Newton <will.newton@linaro.org> wrote:
> ChangeLog:
>
> 2014-04-08  Will Newton  <will.newton@linaro.org>
>
>     * malloc/Makefile (tests): Add tst-mallopt.
>     * malloc/tst-mallopt.c: New file.
> ---
>  malloc/Makefile      |  2 +-
>  malloc/tst-mallopt.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 76 insertions(+), 1 deletion(-)
>  create mode 100644 malloc/tst-mallopt.c

Ping?

This API is pretty tricky to test well as it doesn't reliably signal
errors, but this test does give the function a simple workout.

> diff --git a/malloc/Makefile b/malloc/Makefile
> index 2871726..d962331 100644
> --- a/malloc/Makefile
> +++ b/malloc/Makefile
> @@ -27,7 +27,7 @@ headers := $(dist-headers) obstack.h mcheck.h
>  tests := mallocbug tst-malloc tst-valloc tst-calloc tst-obstack \
>          tst-mallocstate tst-mcheck tst-mallocfork tst-trim1 \
>          tst-malloc-usable tst-realloc tst-posix_memalign \
> -        tst-pvalloc tst-memalign
> +        tst-pvalloc tst-memalign tst-mallopt
>  test-srcs = tst-mtrace
>
>  routines = malloc morecore mcheck mtrace obstack
> diff --git a/malloc/tst-mallopt.c b/malloc/tst-mallopt.c
> new file mode 100644
> index 0000000..9569b7d
> --- /dev/null
> +++ b/malloc/tst-mallopt.c
> @@ -0,0 +1,75 @@
> +/* Copyright (C) 2014 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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include <malloc.h>
> +#include <stdio.h>
> +#include <string.h>
> +
> +static int errors = 0;
> +
> +static void
> +merror (const char *msg)
> +{
> +  ++errors;
> +  printf ("Error: %s\n", msg);
> +}
> +
> +static int
> +do_test (void)
> +{
> +  int ret;
> +
> +  ret = mallopt(M_CHECK_ACTION, 1);
> +
> +  if (ret != 1)
> +    merror ("mallopt (M_CHECK_ACTION, 1) failed.");
> +
> +  ret = mallopt(M_MMAP_MAX, 64*1024);
> +
> +  if (ret != 1)
> +    merror ("mallopt (M_MMAP_MAX, 64*1024) failed.");
> +
> +  ret = mallopt(M_MMAP_THRESHOLD, 64*1024);
> +
> +  if (ret != 1)
> +    merror ("mallopt (M_MMAP_THRESHOLD, 64*1024) failed.");
> +
> +  ret = mallopt(M_MXFAST, 0);
> +
> +  if (ret != 1)
> +    merror ("mallopt (M_MXFAST, 0) failed.");
> +
> +  ret = mallopt(M_PERTURB, 0xa5);
> +
> +  if (ret != 1)
> +    merror ("mallopt (M_PERTURB, 0xa5) failed.");
> +
> +  ret = mallopt(M_TOP_PAD, 64*1024);
> +
> +  if (ret != 1)
> +    merror ("mallopt (M_TOP_PAD, 64*1024) failed.");
> +
> +  ret = mallopt(M_TRIM_THRESHOLD, -1);
> +
> +  if (ret != 1)
> +    merror ("mallopt (M_TRIM_THRESHOLD, -1) failed.");
> +
> +  return errors != 0;
> +}
> +
> +#define TEST_FUNCTION do_test ()
> +#include "../test-skeleton.c"
> --
> 1.8.1.4
>
  
Siddhesh Poyarekar May 12, 2014, 5:55 a.m. UTC | #2
On Thu, May 01, 2014 at 08:54:56AM +0100, Will Newton wrote:
> On 8 April 2014 11:34, Will Newton <will.newton@linaro.org> wrote:
> > ChangeLog:
> >
> > 2014-04-08  Will Newton  <will.newton@linaro.org>
> >
> >     * malloc/Makefile (tests): Add tst-mallopt.
> >     * malloc/tst-mallopt.c: New file.
> > ---
> >  malloc/Makefile      |  2 +-
> >  malloc/tst-mallopt.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  2 files changed, 76 insertions(+), 1 deletion(-)
> >  create mode 100644 malloc/tst-mallopt.c
> 
> Ping?
> 
> This API is pretty tricky to test well as it doesn't reliably signal
> errors, but this test does give the function a simple workout.

... which is a bug.  The function should succeed only when it
encounters valid parameters.

This test looks good to me for the current implementation though, with
the understanding that it will be enhanced when mallopt is fixed to
correctly signal errors.

Siddhesh

> 
> > diff --git a/malloc/Makefile b/malloc/Makefile
> > index 2871726..d962331 100644
> > --- a/malloc/Makefile
> > +++ b/malloc/Makefile
> > @@ -27,7 +27,7 @@ headers := $(dist-headers) obstack.h mcheck.h
> >  tests := mallocbug tst-malloc tst-valloc tst-calloc tst-obstack \
> >          tst-mallocstate tst-mcheck tst-mallocfork tst-trim1 \
> >          tst-malloc-usable tst-realloc tst-posix_memalign \
> > -        tst-pvalloc tst-memalign
> > +        tst-pvalloc tst-memalign tst-mallopt
> >  test-srcs = tst-mtrace
> >
> >  routines = malloc morecore mcheck mtrace obstack
> > diff --git a/malloc/tst-mallopt.c b/malloc/tst-mallopt.c
> > new file mode 100644
> > index 0000000..9569b7d
> > --- /dev/null
> > +++ b/malloc/tst-mallopt.c
> > @@ -0,0 +1,75 @@
> > +/* Copyright (C) 2014 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
> > +   <http://www.gnu.org/licenses/>.  */
> > +
> > +#include <malloc.h>
> > +#include <stdio.h>
> > +#include <string.h>
> > +
> > +static int errors = 0;
> > +
> > +static void
> > +merror (const char *msg)
> > +{
> > +  ++errors;
> > +  printf ("Error: %s\n", msg);
> > +}
> > +
> > +static int
> > +do_test (void)
> > +{
> > +  int ret;
> > +
> > +  ret = mallopt(M_CHECK_ACTION, 1);
> > +
> > +  if (ret != 1)
> > +    merror ("mallopt (M_CHECK_ACTION, 1) failed.");
> > +
> > +  ret = mallopt(M_MMAP_MAX, 64*1024);
> > +
> > +  if (ret != 1)
> > +    merror ("mallopt (M_MMAP_MAX, 64*1024) failed.");
> > +
> > +  ret = mallopt(M_MMAP_THRESHOLD, 64*1024);
> > +
> > +  if (ret != 1)
> > +    merror ("mallopt (M_MMAP_THRESHOLD, 64*1024) failed.");
> > +
> > +  ret = mallopt(M_MXFAST, 0);
> > +
> > +  if (ret != 1)
> > +    merror ("mallopt (M_MXFAST, 0) failed.");
> > +
> > +  ret = mallopt(M_PERTURB, 0xa5);
> > +
> > +  if (ret != 1)
> > +    merror ("mallopt (M_PERTURB, 0xa5) failed.");
> > +
> > +  ret = mallopt(M_TOP_PAD, 64*1024);
> > +
> > +  if (ret != 1)
> > +    merror ("mallopt (M_TOP_PAD, 64*1024) failed.");
> > +
> > +  ret = mallopt(M_TRIM_THRESHOLD, -1);
> > +
> > +  if (ret != 1)
> > +    merror ("mallopt (M_TRIM_THRESHOLD, -1) failed.");
> > +
> > +  return errors != 0;
> > +}
> > +
> > +#define TEST_FUNCTION do_test ()
> > +#include "../test-skeleton.c"
> > --
> > 1.8.1.4
> >
> 
> 
> 
> -- 
> Will Newton
> Toolchain Working Group, Linaro
  

Patch

diff --git a/malloc/Makefile b/malloc/Makefile
index 2871726..d962331 100644
--- a/malloc/Makefile
+++ b/malloc/Makefile
@@ -27,7 +27,7 @@  headers := $(dist-headers) obstack.h mcheck.h
 tests := mallocbug tst-malloc tst-valloc tst-calloc tst-obstack \
 	 tst-mallocstate tst-mcheck tst-mallocfork tst-trim1 \
 	 tst-malloc-usable tst-realloc tst-posix_memalign \
-	 tst-pvalloc tst-memalign
+	 tst-pvalloc tst-memalign tst-mallopt
 test-srcs = tst-mtrace
 
 routines = malloc morecore mcheck mtrace obstack
diff --git a/malloc/tst-mallopt.c b/malloc/tst-mallopt.c
new file mode 100644
index 0000000..9569b7d
--- /dev/null
+++ b/malloc/tst-mallopt.c
@@ -0,0 +1,75 @@ 
+/* Copyright (C) 2014 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
+   <http://www.gnu.org/licenses/>.  */
+
+#include <malloc.h>
+#include <stdio.h>
+#include <string.h>
+
+static int errors = 0;
+
+static void
+merror (const char *msg)
+{
+  ++errors;
+  printf ("Error: %s\n", msg);
+}
+
+static int
+do_test (void)
+{
+  int ret;
+
+  ret = mallopt(M_CHECK_ACTION, 1);
+
+  if (ret != 1)
+    merror ("mallopt (M_CHECK_ACTION, 1) failed.");
+
+  ret = mallopt(M_MMAP_MAX, 64*1024);
+
+  if (ret != 1)
+    merror ("mallopt (M_MMAP_MAX, 64*1024) failed.");
+
+  ret = mallopt(M_MMAP_THRESHOLD, 64*1024);
+
+  if (ret != 1)
+    merror ("mallopt (M_MMAP_THRESHOLD, 64*1024) failed.");
+
+  ret = mallopt(M_MXFAST, 0);
+
+  if (ret != 1)
+    merror ("mallopt (M_MXFAST, 0) failed.");
+
+  ret = mallopt(M_PERTURB, 0xa5);
+
+  if (ret != 1)
+    merror ("mallopt (M_PERTURB, 0xa5) failed.");
+
+  ret = mallopt(M_TOP_PAD, 64*1024);
+
+  if (ret != 1)
+    merror ("mallopt (M_TOP_PAD, 64*1024) failed.");
+
+  ret = mallopt(M_TRIM_THRESHOLD, -1);
+
+  if (ret != 1)
+    merror ("mallopt (M_TRIM_THRESHOLD, -1) failed.");
+
+  return errors != 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"