*printf: Detect large precisions bug on Solaris 10/SPARC.
authorBruno Haible <bruno@clisp.org>
Fri, 24 Dec 2010 09:13:43 +0000 (10:13 +0100)
committerBruno Haible <bruno@clisp.org>
Fri, 24 Dec 2010 09:13:43 +0000 (10:13 +0100)
* m4/printf.m4 (gl_PRINTF_PRECISION): Add one more test code, provided
by Paul Eggert.
* tests/test-snprintf-posix.h (test_function): Add this test code here
too.
* tests/test-sprintf-posix.h (test_function): Likewise.
* tests/test-vasnprintf-posix.c (test_function): Likewise.
* tests/test-vasprintf-posix.c (test_function): Likewise.
* doc/posix-functions/fprintf.texi: Mention Solaris 10 bug as worked
around by gnulib.
* doc/posix-functions/printf.texi: Likewise.
* doc/posix-functions/snprintf.texi: Likewise.
* doc/posix-functions/sprintf.texi: Likewise.
* doc/posix-functions/vfprintf.texi: Likewise.
* doc/posix-functions/vprintf.texi: Likewise.
* doc/posix-functions/vsnprintf.texi: Likewise.
* doc/posix-functions/vsprintf.texi: Likewise.
* doc/posix-functions/dprintf.texi: Undo last commit.
* doc/posix-functions/vdprintf.texi: Likewise.

16 files changed:
ChangeLog
doc/posix-functions/dprintf.texi
doc/posix-functions/fprintf.texi
doc/posix-functions/printf.texi
doc/posix-functions/snprintf.texi
doc/posix-functions/sprintf.texi
doc/posix-functions/vdprintf.texi
doc/posix-functions/vfprintf.texi
doc/posix-functions/vprintf.texi
doc/posix-functions/vsnprintf.texi
doc/posix-functions/vsprintf.texi
m4/printf.m4
tests/test-snprintf-posix.h
tests/test-sprintf-posix.h
tests/test-vasnprintf-posix.c
tests/test-vasprintf-posix.c

index 97909fe..038e38b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2010-12-24  Bruno Haible  <bruno@clisp.org>
+
+       *printf: Detect large precisions bug on Solaris 10/SPARC.
+       * m4/printf.m4 (gl_PRINTF_PRECISION): Add one more test code, provided
+       by Paul Eggert.
+       * tests/test-snprintf-posix.h (test_function): Add this test code here
+       too.
+       * tests/test-sprintf-posix.h (test_function): Likewise.
+       * tests/test-vasnprintf-posix.c (test_function): Likewise.
+       * tests/test-vasprintf-posix.c (test_function): Likewise.
+       * doc/posix-functions/fprintf.texi: Mention Solaris 10 bug as worked
+       around by gnulib.
+       * doc/posix-functions/printf.texi: Likewise.
+       * doc/posix-functions/snprintf.texi: Likewise.
+       * doc/posix-functions/sprintf.texi: Likewise.
+       * doc/posix-functions/vfprintf.texi: Likewise.
+       * doc/posix-functions/vprintf.texi: Likewise.
+       * doc/posix-functions/vsnprintf.texi: Likewise.
+       * doc/posix-functions/vsprintf.texi: Likewise.
+       * doc/posix-functions/dprintf.texi: Undo last commit.
+       * doc/posix-functions/vdprintf.texi: Likewise.
+
 2010-12-23  Paul Eggert  <eggert@cs.ucla.edu>
 
        tests: port test-fdutimensat.c to Solaris 8
index 3f9f54b..dc39022 100644 (file)
@@ -24,9 +24,4 @@ glibc-2.3.6.
 
 Portability problems not fixed by Gnulib:
 @itemize
-@item
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
index 116d20e..e922e85 100644 (file)
@@ -55,6 +55,11 @@ This function does not support precisions larger than 512 or 1024 in integer,
 floating-point and pointer output on some platforms:
 Solaris 10/x86, mingw, BeOS.
 @item
+This function mishandles large floating point precisions
+(for example, formatting 1.0 with @samp{"%.511f"})
+on some platforms:
+Solaris 10.
+@item
 This function can crash in out-of-memory conditions on some platforms:
 MacOS X 10.3, FreeBSD 6.0, NetBSD 5.0.
 @end itemize
@@ -69,9 +74,4 @@ mingw.
 
 Portability problems not fixed by Gnulib:
 @itemize
-@item
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
index fb894d6..eaee96a 100644 (file)
@@ -55,6 +55,11 @@ This function does not support precisions larger than 512 or 1024 in integer,
 floating-point and pointer output on some platforms:
 Solaris 10/x86, mingw, BeOS.
 @item
+This function mishandles large floating point precisions
+(for example, formatting 1.0 with @samp{"%.511f"})
+on some platforms:
+Solaris 10.
+@item
 This function can crash in out-of-memory conditions on some platforms:
 MacOS X 10.3, FreeBSD 6.0, NetBSD 5.0.
 @end itemize
@@ -69,9 +74,4 @@ mingw.
 
 Portability problems not fixed by Gnulib:
 @itemize
-@item
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
index 5d19ccf..aa32808 100644 (file)
@@ -69,6 +69,11 @@ This function does not support precisions larger than 512 or 1024 in integer,
 floating-point and pointer output on some platforms:
 Solaris 10/x86, mingw, BeOS.
 @item
+This function mishandles large floating point precisions
+(for example, formatting 1.0 with @samp{"%.511f"})
+on some platforms:
+Solaris 10.
+@item
 This function can crash in out-of-memory conditions on some platforms:
 MacOS X 10.3, FreeBSD 6.0, NetBSD 5.0.
 @item
@@ -89,9 +94,4 @@ OSF/1 5.1.
 
 Portability problems not fixed by Gnulib:
 @itemize
-@item
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
index cce9627..ad6671f 100644 (file)
@@ -55,15 +55,15 @@ This function does not support precisions larger than 512 or 1024 in integer,
 floating-point and pointer output on some platforms:
 Solaris 10/x86, mingw, BeOS.
 @item
+This function mishandles large floating point precisions
+(for example, formatting 1.0 with @samp{"%.511f"})
+on some platforms:
+Solaris 10.
+@item
 This function can crash in out-of-memory conditions on some platforms:
 MacOS X 10.3, FreeBSD 6.0, NetBSD 5.0.
 @end itemize
 
 Portability problems not fixed by Gnulib:
 @itemize
-@item
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
index 3fa9b73..20a6ef7 100644 (file)
@@ -42,9 +42,4 @@ BeOS.
 
 Portability problems not fixed by Gnulib:
 @itemize
-@item
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
index 7f41c0d..7e50234 100644 (file)
@@ -55,6 +55,11 @@ This function does not support precisions larger than 512 or 1024 in integer,
 floating-point and pointer output on some platforms:
 Solaris 10/x86, mingw, BeOS.
 @item
+This function mishandles large floating point precisions
+(for example, formatting 1.0 with @samp{"%.511f"})
+on some platforms:
+Solaris 10.
+@item
 This function can crash in out-of-memory conditions on some platforms:
 MacOS X 10.3, FreeBSD 6.0, NetBSD 5.0.
 @end itemize
@@ -69,9 +74,4 @@ mingw.
 
 Portability problems not fixed by Gnulib:
 @itemize
-@item
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
index 213461c..526070e 100644 (file)
@@ -55,6 +55,11 @@ This function does not support precisions larger than 512 or 1024 in integer,
 floating-point and pointer output on some platforms:
 Solaris 10/x86, mingw, BeOS.
 @item
+This function mishandles large floating point precisions
+(for example, formatting 1.0 with @samp{"%.511f"})
+on some platforms:
+Solaris 10.
+@item
 This function can crash in out-of-memory conditions on some platforms:
 MacOS X 10.3, FreeBSD 6.0, NetBSD 5.0.
 @end itemize
@@ -69,9 +74,4 @@ mingw.
 
 Portability problems not fixed by Gnulib:
 @itemize
-@item
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
index 38266a0..2ea98cb 100644 (file)
@@ -69,6 +69,11 @@ This function does not support precisions larger than 512 or 1024 in integer,
 floating-point and pointer output on some platforms:
 Solaris 10/x86, mingw, BeOS.
 @item
+This function mishandles large floating point precisions
+(for example, formatting 1.0 with @samp{"%.511f"})
+on some platforms:
+Solaris 10.
+@item
 This function can crash in out-of-memory conditions on some platforms:
 MacOS X 10.3, FreeBSD 6.0, NetBSD 5.0.
 @item
@@ -89,9 +94,4 @@ HP-UX 11, OSF/1 5.1.
 
 Portability problems not fixed by Gnulib:
 @itemize
-@item
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
index 3178538..39203d0 100644 (file)
@@ -55,15 +55,15 @@ This function does not support precisions larger than 512 or 1024 in integer,
 floating-point and pointer output on some platforms:
 Solaris 10/x86, mingw, BeOS.
 @item
+This function mishandles large floating point precisions
+(for example, formatting 1.0 with @samp{"%.511f"})
+on some platforms:
+Solaris 10.
+@item
 This function can crash in out-of-memory conditions on some platforms:
 MacOS X 10.3, FreeBSD 6.0, NetBSD 5.0.
 @end itemize
 
 Portability problems not fixed by Gnulib:
 @itemize
-@item
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
index 8cffa6a..6c8a7a4 100644 (file)
@@ -1,4 +1,4 @@
-# printf.m4 serial 41
+# printf.m4 serial 42
 dnl Copyright (C) 2003, 2007-2010 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -890,8 +890,9 @@ changequote([,])dnl
 dnl Test whether the *printf family of functions supports large precisions.
 dnl On mingw, precisions larger than 512 are treated like 512, in integer,
 dnl floating-point or pointer output. On Solaris 10/x86, precisions larger
-dnl than 510 in floating-point output crash the program. On BeOS, precisions
-dnl larger than 1044 crash the program.
+dnl than 510 in floating-point output crash the program. On Solaris 10/SPARC,
+dnl precisions larger than 510 in floating-point output yield wrong results.
+dnl On BeOS, precisions larger than 1044 crash the program.
 dnl Result is gl_cv_func_printf_precision.
 
 AC_DEFUN([gl_PRINTF_PRECISION],
@@ -917,6 +918,9 @@ int main ()
     result |= 1;
   if (sprintf (buf, "%.4000f %d", 1.0, 33, 44) < 4000 + 5)
     result |= 2;
+  if (sprintf (buf, "%.511f %d", 1.0, 33, 44) < 511 + 5
+      || buf[0] != '1')
+    result |= 4;
   return result;
 }]])],
         [gl_cv_func_printf_precision=yes],
@@ -1459,7 +1463,7 @@ dnl   Cygwin 1.5.25 (2008)           .  .  .  #  #  .  .  #  .  .  .  .  .  #  .
 dnl   Cygwin 1.5.19 (2006)           #  .  .  #  #  #  .  #  .  #  .  #  #  #  .  .  .  .  .  .
 dnl   Solaris 11 2010-11             .  .  #  #  #  .  .  #  .  .  .  #  .  .  .  .  .  .  .  .
 dnl   Solaris 10                     .  .  #  #  #  .  .  #  .  .  .  #  #  .  .  .  .  .  .  .
-dnl   Solaris 2.6 ... 9              #  .  #  #  #  #  .  #  .  .  .  #  .  .  .  .  #  .  .  .
+dnl   Solaris 2.6 ... 9              #  .  #  #  #  #  .  #  .  .  .  #  #  .  .  .  #  .  .  .
 dnl   Solaris 2.5.1                  #  .  #  #  #  #  .  #  .  .  .  #  .  .  #  #  #  #  #  #
 dnl   AIX 5.2, 7.1                   .  .  #  #  #  .  .  .  .  .  .  #  .  .  .  .  .  .  .  .
 dnl   AIX 4.3.2, 5.1                 #  .  #  #  #  #  .  .  .  .  .  #  .  .  .  .  #  .  .  .
index 37612f9..b2a0ebe 100644 (file)
@@ -3045,6 +3045,19 @@ test_function (int (*my_snprintf) (char *, size_t, const char *, ...))
   }
 
   {
+    char result[1000];
+    int retval =
+      my_snprintf (result, sizeof (result), "%.511f %d", 1.0, 99);
+    size_t i;
+    ASSERT (result[0] == '1');
+    ASSERT (result[1] == '.');
+    for (i = 0; i < 511; i++)
+      ASSERT (result[2 + i] == '0');
+    ASSERT (strcmp (result + 2 + 511, " 99") == 0);
+    ASSERT (retval == strlen (result));
+  }
+
+  {
     char input[5000];
     char result[5000];
     int retval;
index ff162aa..35451da 100644 (file)
@@ -3031,6 +3031,19 @@ test_function (int (*my_sprintf) (char *, const char *, ...))
   }
 
   {
+    char result[1000];
+    int retval =
+      my_sprintf (result, "%.511f %d", 1.0, 99);
+    size_t i;
+    ASSERT (result[0] == '1');
+    ASSERT (result[1] == '.');
+    for (i = 0; i < 511; i++)
+      ASSERT (result[2 + i] == '0');
+    ASSERT (strcmp (result + 2 + 511, " 99") == 0);
+    ASSERT (retval == strlen (result));
+  }
+
+  {
     char input[5000];
     char result[5000];
     int retval;
index dd98691..44f262f 100644 (file)
@@ -3568,6 +3568,21 @@ test_function (char * (*my_asnprintf) (char *, size_t *, const char *, ...))
   }
 
   {
+    size_t length;
+    char *result =
+      my_asnprintf (NULL, &length, "%.511f %d", 1.0, 99);
+    size_t i;
+    ASSERT (result != NULL);
+    ASSERT (result[0] == '1');
+    ASSERT (result[1] == '.');
+    for (i = 0; i < 511; i++)
+      ASSERT (result[2 + i] == '0');
+    ASSERT (strcmp (result + 2 + 511, " 99") == 0);
+    ASSERT (length == strlen (result));
+    free (result);
+  }
+
+  {
     char input[5000];
     size_t length;
     char *result;
index 8f71c4f..5b586ad 100644 (file)
@@ -3548,6 +3548,21 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
   }
 
   {
+    char *result;
+    int retval =
+      my_asprintf (&result, "%.511f %d", 1.0, 99);
+    size_t i;
+    ASSERT (result != NULL);
+    ASSERT (result[0] == '1');
+    ASSERT (result[1] == '.');
+    for (i = 0; i < 511; i++)
+      ASSERT (result[2 + i] == '0');
+    ASSERT (strcmp (result + 2 + 511, " 99") == 0);
+    ASSERT (retval == strlen (result));
+    free (result);
+  }
+
+  {
     char input[5000];
     char *result;
     int retval;