[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: test-memchr failure on rawhide
From: |
Bruno Haible |
Subject: |
Re: test-memchr failure on rawhide |
Date: |
Wed, 13 May 2009 02:49:58 +0200 |
User-agent: |
KMail/1.9.9 |
Jakub Jelinek, when closing the two reported glibc bugs, agreed with
our interpretation that a NULL pointer is an invalid argument to memchr
but a pointer to a zero-sized memory region is valid.
Here is a proposed patch to make the gnulib unit tests compliant,
without removing the particular test.
Opinions? Objections?
2009-05-12 Bruno Haible <address@hidden>
Make some tests ISO C 99 compliant.
* tests/zerosize-ptr.h: New file.
* tests/test-memchr.c: Include zerosize-ptr.h.
(main): Use a zero-size object pointer instead of NULL.
* tests/test-memchr2.c: Include zerosize-ptr.h.
(main): Use a zero-size object pointer instead of NULL.
* tests/test-memcmp.c: Include zerosize-ptr.h.
(main): Use a zero-size object pointer instead of NULL.
* tests/test-memmem.c: Include zerosize-ptr.h.
(main): Use a zero-size object pointer instead of NULL.
* tests/test-memrchr.c: Include zerosize-ptr.h.
(main): Use a zero-size object pointer instead of NULL.
* modules/memchr-tests (Files): Add tests/zerosize-ptr.h,
m4/mmap-anon.m4.
(Depends-on): Add getpagesize.
(configure.ac): Invoke gl_FUNC_MMAP_ANON. Check for mprotect.
* modules/memchr2-tests (Files): Add tests/zerosize-ptr.h,
m4/mmap-anon.m4.
(Depends-on): Add getpagesize.
(configure.ac): Invoke gl_FUNC_MMAP_ANON. Check for mprotect.
* modules/memcmp-tests (Files): Add tests/zerosize-ptr.h,
m4/mmap-anon.m4.
(Depends-on): Add getpagesize.
(configure.ac): Invoke gl_FUNC_MMAP_ANON. Check for mprotect.
* modules/memmem-tests (Files): Add tests/zerosize-ptr.h,
m4/mmap-anon.m4.
(Depends-on): Add getpagesize.
(configure.ac): Invoke gl_FUNC_MMAP_ANON. Check for mprotect.
* modules/memrchr-tests (Files): Add tests/zerosize-ptr.h,
m4/mmap-anon.m4.
(Depends-on): Add getpagesize.
(configure.ac): Invoke gl_FUNC_MMAP_ANON. Check for mprotect.
============================= tests/zerosize-ptr.h =============================
/* Return a pointer to a zero-size object in memory.
Copyright (C) 2009 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* ISO C 99 does not allow memcmp(), memchr() etc. to be invoked with a NULL
argument. Therefore this file produces a non-NULL pointer which cannot
be dereferenced, if possible. */
#include <stdlib.h>
#if HAVE_MPROTECT
# include <fcntl.h>
# include <unistd.h>
# include <sys/types.h>
# include <sys/mman.h>
/* Define MAP_FILE when it isn't otherwise. */
# ifndef MAP_FILE
# define MAP_FILE 0
# endif
#endif
/* Return a pointer to a zero-size object in memory, if possible.
Return NULL otherwise. */
static void *
zerosize_ptr (void)
{
/* Use mmap and mprotect when they exist. Don't test HAVE_MMAP, because it is
not defined on HP-UX 11 (since it does not support MAP_FIXED). */
#if HAVE_MPROTECT
# if HAVE_MAP_ANONYMOUS
const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
const int fd = -1;
# else /* !HAVE_MAP_ANONYMOUS */
const int flags = MAP_FILE | MAP_PRIVATE;
int fd = open ("/dev/zero", O_RDONLY, 0666);
if (fd >= 0)
# endif
{
int pagesize = getpagesize ();
char *two_pages =
(char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE,
flags, fd, 0);
if (two_pages != (char *)(-1)
&& mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0)
return two_pages + pagesize;
}
#endif
return NULL;
}
================================================================================
--- tests/test-memchr.c.orig 2009-05-13 02:38:13.000000000 +0200
+++ tests/test-memchr.c 2009-05-13 01:24:29.000000000 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Free Software Foundation
+ * Copyright (C) 2008-2009 Free Software Foundation
* Written by Eric Blake and Bruno Haible
*
* This program is free software: you can redistribute it and/or modify
@@ -22,6 +22,8 @@
#include <stdio.h>
#include <stdlib.h>
+#include "zerosize-ptr.h"
+
#define ASSERT(expr) \
do \
{ \
@@ -41,8 +43,6 @@
int
main ()
{
- void *nil = NULL; /* Use to avoid gcc attribute((nonnull)) warnings. */
-
size_t n = 0x100000;
char *input = malloc (n);
ASSERT (input);
@@ -58,7 +58,7 @@
ASSERT (MEMCHR (input, 'a', n) == input);
ASSERT (MEMCHR (input, 'a', 0) == NULL);
- ASSERT (MEMCHR (nil, 'a', 0) == NULL);
+ ASSERT (MEMCHR (zerosize_ptr (), 'a', 0) == NULL);
ASSERT (MEMCHR (input, 'b', n) == input + 1);
ASSERT (MEMCHR (input, 'c', n) == input + 2);
--- tests/test-memchr2.c.orig 2009-05-13 02:38:13.000000000 +0200
+++ tests/test-memchr2.c 2009-05-13 01:24:29.000000000 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Free Software Foundation
+ * Copyright (C) 2008-2009 Free Software Foundation
* Written by Eric Blake
*
* This program is free software: you can redistribute it and/or modify
@@ -23,6 +23,8 @@
#include <stdlib.h>
#include <string.h>
+#include "zerosize-ptr.h"
+
#define ASSERT(expr) \
do \
{ \
@@ -58,7 +60,7 @@
ASSERT (MEMCHR2 (input, 'b', 'a', n) == input);
ASSERT (MEMCHR2 (input, 'a', 'b', 0) == NULL);
- ASSERT (MEMCHR2 (NULL, 'a', 'b', 0) == NULL);
+ ASSERT (MEMCHR2 (zerosize_ptr (), 'a', 'b', 0) == NULL);
ASSERT (MEMCHR2 (input, 'b', 'd', n) == input + 1);
ASSERT (MEMCHR2 (input + 2, 'b', 'd', n - 2) == input + 1026);
--- tests/test-memcmp.c.orig 2009-05-13 02:38:13.000000000 +0200
+++ tests/test-memcmp.c 2009-05-13 01:24:29.000000000 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Free Software Foundation
+ * Copyright (C) 2008-2009 Free Software Foundation
* Written by Simon Josefsson
*
* This program is free software: you can redistribute it and/or modify
@@ -22,6 +22,8 @@
#include <stdio.h>
#include <stdlib.h>
+#include "zerosize-ptr.h"
+
#define ASSERT(expr) \
do \
{ \
@@ -37,10 +39,8 @@
int
main (void)
{
- void *nil = NULL; /* Use to avoid gcc attribute((nonnull)) warnings. */
-
/* Test equal / not equal distinction. */
- ASSERT (memcmp (nil, nil, 0) == 0);
+ ASSERT (memcmp (zerosize_ptr (), zerosize_ptr (), 0) == 0);
ASSERT (memcmp ("foo", "foobar", 2) == 0);
ASSERT (memcmp ("foo", "foobar", 3) == 0);
ASSERT (memcmp ("foo", "foobar", 4) != 0);
--- tests/test-memmem.c.orig 2009-05-13 02:38:13.000000000 +0200
+++ tests/test-memmem.c 2009-05-13 01:24:30.000000000 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007, 2008 Free Software Foundation
+ * Copyright (C) 2004, 2007-2009 Free Software Foundation
* Written by Bruno Haible and Eric Blake
*
* This program is free software: you can redistribute it and/or modify
@@ -24,6 +24,8 @@
#include <stdlib.h>
#include <unistd.h>
+#include "zerosize-ptr.h"
+
#define ASSERT(expr) \
do \
{ \
@@ -78,9 +80,9 @@
ASSERT (result == input + 11);
}
- /* Check that length 0 does not dereference NULL. */
+ /* Check that length 0 does not dereference the pointer. */
{
- const char *result = memmem (NULL, 0, "foo", 3);
+ const char *result = memmem (zerosize_ptr (), 0, "foo", 3);
ASSERT (result == NULL);
}
--- tests/test-memrchr.c.orig 2009-05-13 02:38:13.000000000 +0200
+++ tests/test-memrchr.c 2009-05-13 01:24:30.000000000 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Free Software Foundation
+ * Copyright (C) 2008-2009 Free Software Foundation
* Written by Eric Blake and Bruno Haible
*
* This program is free software: you can redistribute it and/or modify
@@ -22,6 +22,8 @@
#include <stdio.h>
#include <stdlib.h>
+#include "zerosize-ptr.h"
+
#define ASSERT(expr) \
do \
{ \
@@ -41,8 +43,6 @@
int
main ()
{
- void *nil = NULL; /* Use to avoid gcc attribute((nonnull)) warnings. */
-
size_t n = 0x100000;
char *input = malloc (n);
ASSERT (input);
@@ -58,7 +58,7 @@
ASSERT (MEMRCHR (input, 'a', n) == input + n - 1);
ASSERT (MEMRCHR (input, 'a', 0) == NULL);
- ASSERT (MEMRCHR (nil, 'a', 0) == NULL);
+ ASSERT (MEMRCHR (zerosize_ptr (), 'a', 0) == NULL);
ASSERT (MEMRCHR (input, 'b', n) == input + n - 2);
ASSERT (MEMRCHR (input, 'c', n) == input + n - 3);
--- modules/memchr-tests.orig 2009-05-13 02:38:13.000000000 +0200
+++ modules/memchr-tests 2009-05-13 01:31:19.000000000 +0200
@@ -1,9 +1,14 @@
Files:
tests/test-memchr.c
+tests/zerosize-ptr.h
+m4/mmap-anon.m4
Depends-on:
+getpagesize
configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_FUNCS_ONCE([mprotect])
Makefile.am:
TESTS += test-memchr
--- modules/memchr2-tests.orig 2009-05-13 02:38:13.000000000 +0200
+++ modules/memchr2-tests 2009-05-13 01:31:22.000000000 +0200
@@ -1,9 +1,14 @@
Files:
tests/test-memchr2.c
+tests/zerosize-ptr.h
+m4/mmap-anon.m4
Depends-on:
+getpagesize
configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_FUNCS_ONCE([mprotect])
Makefile.am:
TESTS += test-memchr2
--- modules/memcmp-tests.orig 2009-05-13 02:38:13.000000000 +0200
+++ modules/memcmp-tests 2009-05-13 01:31:32.000000000 +0200
@@ -1,9 +1,14 @@
Files:
tests/test-memcmp.c
+tests/zerosize-ptr.h
+m4/mmap-anon.m4
Depends-on:
+getpagesize
configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_FUNCS_ONCE([mprotect])
Makefile.am:
TESTS += test-memcmp
--- modules/memmem-tests.orig 2009-05-13 02:38:13.000000000 +0200
+++ modules/memmem-tests 2009-05-13 01:31:29.000000000 +0200
@@ -1,9 +1,14 @@
Files:
tests/test-memmem.c
+tests/zerosize-ptr.h
+m4/mmap-anon.m4
Depends-on:
+getpagesize
configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_FUNCS_ONCE([mprotect])
AC_CHECK_DECLS_ONCE([alarm])
Makefile.am:
--- modules/memrchr-tests.orig 2009-05-13 02:38:13.000000000 +0200
+++ modules/memrchr-tests 2009-05-13 01:31:26.000000000 +0200
@@ -1,9 +1,14 @@
Files:
tests/test-memrchr.c
+tests/zerosize-ptr.h
+m4/mmap-anon.m4
Depends-on:
+getpagesize
configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_FUNCS_ONCE([mprotect])
Makefile.am:
TESTS += test-memrchr
- Re: test-memchr failure on rawhide, (continued)
- Re: test-memchr failure on rawhide, Bruno Haible, 2009/05/09
- Re: test-memchr failure on rawhide, Andreas Schwab, 2009/05/09
- Re: test-memchr failure on rawhide, Bruno Haible, 2009/05/09
- Re: test-memchr failure on rawhide, Andreas Schwab, 2009/05/09
- Re: test-memchr failure on rawhide, Bruno Haible, 2009/05/11
- Re: test-memchr failure on rawhide, Andreas Schwab, 2009/05/11
- Re: test-memchr failure on rawhide, Ben Pfaff, 2009/05/09
- Re: test-memchr failure on rawhide, Bruno Haible, 2009/05/10
- Re: test-memchr failure on rawhide, Jim Meyering, 2009/05/11
- Re: test-memchr failure on rawhide, Bruno Haible, 2009/05/11
- Re: test-memchr failure on rawhide,
Bruno Haible <=
- Re: test-memchr failure on rawhide, Eric Blake, 2009/05/12
- Re: test-memchr failure on rawhide, Jim Meyering, 2009/05/13
- Re: test-memchr failure on rawhide, Bruno Haible, 2009/05/13
- Re: test-memchr failure on rawhide, Eric Blake, 2009/05/13
Re: test-memchr failure on rawhide, Jim Meyering, 2009/05/08