# HG changeset patch # User Bruno Haible # Date 1242257947 -7200 # Node ID 1e84e9b3384a74d80b60c8275caccef1f9a92c84 # Parent ad41328f771ef9285fbc9e9335bda17ea3f4d839 Make some tests ISO C 99 compliant. diff -r ad41328f771e -r 1e84e9b3384a ChangeLog --- a/ChangeLog Wed May 13 03:23:42 2009 +0200 +++ b/ChangeLog Thu May 14 01:39:07 2009 +0200 @@ -1,3 +1,38 @@ +2009-05-13 Bruno Haible + + 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. + 2009-05-12 Bruno Haible Tests for module 'alignof'. diff -r ad41328f771e -r 1e84e9b3384a modules/memchr-tests --- a/modules/memchr-tests Wed May 13 03:23:42 2009 +0200 +++ b/modules/memchr-tests Thu May 14 01:39:07 2009 +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 diff -r ad41328f771e -r 1e84e9b3384a modules/memchr2-tests --- a/modules/memchr2-tests Wed May 13 03:23:42 2009 +0200 +++ b/modules/memchr2-tests Thu May 14 01:39:07 2009 +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 diff -r ad41328f771e -r 1e84e9b3384a modules/memcmp-tests --- a/modules/memcmp-tests Wed May 13 03:23:42 2009 +0200 +++ b/modules/memcmp-tests Thu May 14 01:39:07 2009 +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 diff -r ad41328f771e -r 1e84e9b3384a modules/memmem-tests --- a/modules/memmem-tests Wed May 13 03:23:42 2009 +0200 +++ b/modules/memmem-tests Thu May 14 01:39:07 2009 +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: diff -r ad41328f771e -r 1e84e9b3384a modules/memrchr-tests --- a/modules/memrchr-tests Wed May 13 03:23:42 2009 +0200 +++ b/modules/memrchr-tests Thu May 14 01:39:07 2009 +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 diff -r ad41328f771e -r 1e84e9b3384a tests/test-memchr.c --- a/tests/test-memchr.c Wed May 13 03:23:42 2009 +0200 +++ b/tests/test-memchr.c Thu May 14 01:39:07 2009 +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 #include +#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); diff -r ad41328f771e -r 1e84e9b3384a tests/test-memchr2.c --- a/tests/test-memchr2.c Wed May 13 03:23:42 2009 +0200 +++ b/tests/test-memchr2.c Thu May 14 01:39:07 2009 +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 #include +#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); diff -r ad41328f771e -r 1e84e9b3384a tests/test-memcmp.c --- a/tests/test-memcmp.c Wed May 13 03:23:42 2009 +0200 +++ b/tests/test-memcmp.c Thu May 14 01:39:07 2009 +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 #include +#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 -r ad41328f771e -r 1e84e9b3384a tests/test-memmem.c --- a/tests/test-memmem.c Wed May 13 03:23:42 2009 +0200 +++ b/tests/test-memmem.c Thu May 14 01:39:07 2009 +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 #include +#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); } diff -r ad41328f771e -r 1e84e9b3384a tests/test-memrchr.c --- a/tests/test-memrchr.c Wed May 13 03:23:42 2009 +0200 +++ b/tests/test-memrchr.c Thu May 14 01:39:07 2009 +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 #include +#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); diff -r ad41328f771e -r 1e84e9b3384a tests/zerosize-ptr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/zerosize-ptr.h Thu May 14 01:39:07 2009 +0200 @@ -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 . */ + +/* 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 + +#if HAVE_MPROTECT +# include +# include +# include +# include +/* 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; +}