changeset 14005:f585ecc144aa

*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.
author Bruno Haible <bruno@clisp.org>
date Fri, 24 Dec 2010 10:13:43 +0100
parents 054a6361f124
children 6fb5b50662b4
files 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
diffstat 16 files changed, 126 insertions(+), 54 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Dec 24 00:06:16 2010 -0800
+++ b/ChangeLog	Fri Dec 24 10:13:43 2010 +0100
@@ -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
--- a/doc/posix-functions/dprintf.texi	Fri Dec 24 00:06:16 2010 -0800
+++ b/doc/posix-functions/dprintf.texi	Fri Dec 24 10:13:43 2010 +0100
@@ -24,9 +24,4 @@
 
 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
--- a/doc/posix-functions/fprintf.texi	Fri Dec 24 00:06:16 2010 -0800
+++ b/doc/posix-functions/fprintf.texi	Fri Dec 24 10:13:43 2010 +0100
@@ -55,6 +55,11 @@
 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 @@
 
 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
--- a/doc/posix-functions/printf.texi	Fri Dec 24 00:06:16 2010 -0800
+++ b/doc/posix-functions/printf.texi	Fri Dec 24 10:13:43 2010 +0100
@@ -55,6 +55,11 @@
 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 @@
 
 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
--- a/doc/posix-functions/snprintf.texi	Fri Dec 24 00:06:16 2010 -0800
+++ b/doc/posix-functions/snprintf.texi	Fri Dec 24 10:13:43 2010 +0100
@@ -69,6 +69,11 @@
 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 @@
 
 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
--- a/doc/posix-functions/sprintf.texi	Fri Dec 24 00:06:16 2010 -0800
+++ b/doc/posix-functions/sprintf.texi	Fri Dec 24 10:13:43 2010 +0100
@@ -55,15 +55,15 @@
 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
--- a/doc/posix-functions/vdprintf.texi	Fri Dec 24 00:06:16 2010 -0800
+++ b/doc/posix-functions/vdprintf.texi	Fri Dec 24 10:13:43 2010 +0100
@@ -42,9 +42,4 @@
 
 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
--- a/doc/posix-functions/vfprintf.texi	Fri Dec 24 00:06:16 2010 -0800
+++ b/doc/posix-functions/vfprintf.texi	Fri Dec 24 10:13:43 2010 +0100
@@ -55,6 +55,11 @@
 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 @@
 
 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
--- a/doc/posix-functions/vprintf.texi	Fri Dec 24 00:06:16 2010 -0800
+++ b/doc/posix-functions/vprintf.texi	Fri Dec 24 10:13:43 2010 +0100
@@ -55,6 +55,11 @@
 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 @@
 
 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
--- a/doc/posix-functions/vsnprintf.texi	Fri Dec 24 00:06:16 2010 -0800
+++ b/doc/posix-functions/vsnprintf.texi	Fri Dec 24 10:13:43 2010 +0100
@@ -69,6 +69,11 @@
 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 @@
 
 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
--- a/doc/posix-functions/vsprintf.texi	Fri Dec 24 00:06:16 2010 -0800
+++ b/doc/posix-functions/vsprintf.texi	Fri Dec 24 10:13:43 2010 +0100
@@ -55,15 +55,15 @@
 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
--- a/m4/printf.m4	Fri Dec 24 00:06:16 2010 -0800
+++ b/m4/printf.m4	Fri Dec 24 10:13:43 2010 +0100
@@ -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 @@
 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 @@
     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.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                 #  .  #  #  #  #  .  .  .  .  .  #  .  .  .  .  #  .  .  .
--- a/tests/test-snprintf-posix.h	Fri Dec 24 00:06:16 2010 -0800
+++ b/tests/test-snprintf-posix.h	Fri Dec 24 10:13:43 2010 +0100
@@ -3045,6 +3045,19 @@
   }
 
   {
+    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;
--- a/tests/test-sprintf-posix.h	Fri Dec 24 00:06:16 2010 -0800
+++ b/tests/test-sprintf-posix.h	Fri Dec 24 10:13:43 2010 +0100
@@ -3031,6 +3031,19 @@
   }
 
   {
+    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;
--- a/tests/test-vasnprintf-posix.c	Fri Dec 24 00:06:16 2010 -0800
+++ b/tests/test-vasnprintf-posix.c	Fri Dec 24 10:13:43 2010 +0100
@@ -3568,6 +3568,21 @@
   }
 
   {
+    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;
--- a/tests/test-vasprintf-posix.c	Fri Dec 24 00:06:16 2010 -0800
+++ b/tests/test-vasprintf-posix.c	Fri Dec 24 10:13:43 2010 +0100
@@ -3548,6 +3548,21 @@
   }
 
   {
+    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;