summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2009-05-14 01:39:07 +0200
committerBruno Haible <bruno@clisp.org>2009-05-14 01:39:46 +0200
commitbb051a0a3c0febe9d3fabb21ae5b7fcc2ae7aa10 (patch)
tree3fd122ab88201bb57d17981f59ef912d36ba4cee /tests
parent610a9cc95c2a1c9c0260ea7d0f9a850c6c017828 (diff)
downloadgnulib-bb051a0a3c0febe9d3fabb21ae5b7fcc2ae7aa10.tar.gz
Make some tests ISO C 99 compliant.
Diffstat (limited to 'tests')
-rw-r--r--tests/test-memchr.c8
-rw-r--r--tests/test-memchr2.c6
-rw-r--r--tests/test-memcmp.c8
-rw-r--r--tests/test-memmem.c8
-rw-r--r--tests/test-memrchr.c8
-rw-r--r--tests/zerosize-ptr.h62
6 files changed, 83 insertions, 17 deletions
diff --git a/tests/test-memchr.c b/tests/test-memchr.c
index ebf3cfcdc5..bf99a82edb 100644
--- a/tests/test-memchr.c
+++ b/tests/test-memchr.c
@@ -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 @@ main ()
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);
diff --git a/tests/test-memchr2.c b/tests/test-memchr2.c
index c804a41582..c7ba6b9735 100644
--- a/tests/test-memchr2.c
+++ b/tests/test-memchr2.c
@@ -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 @@ main ()
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);
diff --git a/tests/test-memcmp.c b/tests/test-memcmp.c
index 50342cb968..d108198f97 100644
--- a/tests/test-memcmp.c
+++ b/tests/test-memcmp.c
@@ -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);
diff --git a/tests/test-memmem.c b/tests/test-memmem.c
index e429ac096a..7f0f9257a3 100644
--- a/tests/test-memmem.c
+++ b/tests/test-memmem.c
@@ -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 @@ main (int argc, char *argv[])
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);
}
diff --git a/tests/test-memrchr.c b/tests/test-memrchr.c
index f829a226ae..63568c1566 100644
--- a/tests/test-memrchr.c
+++ b/tests/test-memrchr.c
@@ -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 @@ main ()
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);
diff --git a/tests/zerosize-ptr.h b/tests/zerosize-ptr.h
new file mode 100644
index 0000000000..fa00aeeee5
--- /dev/null
+++ b/tests/zerosize-ptr.h
@@ -0,0 +1,62 @@
+/* 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;
+}