bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] doc: document Solaris printf bug with large float precisions


From: Bruno Haible
Subject: Re: [PATCH] doc: document Solaris printf bug with large float precisions
Date: Fri, 24 Dec 2010 10:06:18 +0100
User-agent: KMail/1.9.9

Hello Paul,

> This prints "513 0.0...." rather than the correct "513 1.0....".

Indeed. I reproduce on Solaris 10/SPARC. On Solaris 10/x86, the result is
simply a SIGSEGV.

When I build a testdir for 'snprintf-posix', the results are:
  - On Solaris 10/x86:
      checking whether printf supports large precisions... no
      checking whether printf survives out-of-memory conditions... no
    REPLACE_SNPRINTF is 1.
    All tests pass.
  - On Solaris 10/sparc:
      checking whether printf supports large precisions... yes
      checking whether printf survives out-of-memory conditions... yes
    REPLACE_SNPRINTF is 1.
    test-snprintf-posix fails:
      test-snprintf-posix.h:3039: assertion failed
      bash: line 5:  2924 Abort                   (core dumped) EXEEXT='' 
srcdir='.' MAKE='make' ${dir}$tst
      FAIL: test-snprintf-posix

So the existing test whether printf supports large precisions was incomplete.
I'm integrating your test case, so that configure will now say "no"
on both Solaris 10/x86 and Solaris 10/sparc.

> doc/posix-functions/dprintf.texi (dprintf):
> doc/posix-functions/vdprintf.texi (vdprintf):

You did not need to modify these files. Solaris does not have dprintf and
vdprintf.

I'll check in this fix:


2010-12-24  Bruno Haible  <address@hidden>

        *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.

--- doc/posix-functions/dprintf.texi.orig       Fri Dec 24 09:56:06 2010
+++ doc/posix-functions/dprintf.texi    Fri Dec 24 09:41:40 2010
@@ -24,9 +24,4 @@
 
 Portability problems not fixed by Gnulib:
 @itemize
address@hidden
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
--- doc/posix-functions/fprintf.texi.orig       Fri Dec 24 09:56:06 2010
+++ doc/posix-functions/fprintf.texi    Fri Dec 24 09:38:24 2010
@@ -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.
address@hidden
 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
address@hidden
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
--- doc/posix-functions/printf.texi.orig        Fri Dec 24 09:56:06 2010
+++ doc/posix-functions/printf.texi     Fri Dec 24 09:39:25 2010
@@ -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.
address@hidden
 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
address@hidden
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
--- doc/posix-functions/snprintf.texi.orig      Fri Dec 24 09:56:06 2010
+++ doc/posix-functions/snprintf.texi   Fri Dec 24 09:39:43 2010
@@ -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.
address@hidden
 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
address@hidden
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
--- doc/posix-functions/sprintf.texi.orig       Fri Dec 24 09:56:06 2010
+++ doc/posix-functions/sprintf.texi    Fri Dec 24 09:39:57 2010
@@ -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.
address@hidden
 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
address@hidden
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
--- doc/posix-functions/vdprintf.texi.orig      Fri Dec 24 09:56:06 2010
+++ doc/posix-functions/vdprintf.texi   Fri Dec 24 09:41:33 2010
@@ -42,9 +42,4 @@
 
 Portability problems not fixed by Gnulib:
 @itemize
address@hidden
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
--- doc/posix-functions/vfprintf.texi.orig      Fri Dec 24 09:56:06 2010
+++ doc/posix-functions/vfprintf.texi   Fri Dec 24 09:40:12 2010
@@ -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.
address@hidden
 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
address@hidden
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
--- doc/posix-functions/vprintf.texi.orig       Fri Dec 24 09:56:06 2010
+++ doc/posix-functions/vprintf.texi    Fri Dec 24 09:40:21 2010
@@ -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.
address@hidden
 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
address@hidden
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
--- doc/posix-functions/vsnprintf.texi.orig     Fri Dec 24 09:56:07 2010
+++ doc/posix-functions/vsnprintf.texi  Fri Dec 24 09:40:36 2010
@@ -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.
address@hidden
 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
address@hidden
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
--- doc/posix-functions/vsprintf.texi.orig      Fri Dec 24 09:56:07 2010
+++ doc/posix-functions/vsprintf.texi   Fri Dec 24 09:40:57 2010
@@ -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.
address@hidden
 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
address@hidden
-This function mishandles large floating point precisions
-(for example, formatting 1.0 with @samp{"%.511f"})
-on some platforms:
-Solaris 10.
 @end itemize
--- m4/printf.m4.orig   Fri Dec 24 09:56:07 2010
+++ m4/printf.m4        Fri Dec 24 09:29:56 2010
@@ -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                 #  .  #  #  #  #  .  .  .  .  .  #  .  .  
.  .  #  .  .  .
--- tests/test-snprintf-posix.h.orig    Fri Dec 24 09:56:07 2010
+++ tests/test-snprintf-posix.h Fri Dec 24 09:32:48 2010
@@ -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;
--- tests/test-sprintf-posix.h.orig     Fri Dec 24 09:56:07 2010
+++ tests/test-sprintf-posix.h  Fri Dec 24 09:31:28 2010
@@ -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;
--- tests/test-vasnprintf-posix.c.orig  Fri Dec 24 09:56:07 2010
+++ tests/test-vasnprintf-posix.c       Fri Dec 24 09:32:11 2010
@@ -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;
--- tests/test-vasprintf-posix.c.orig   Fri Dec 24 09:56:07 2010
+++ tests/test-vasprintf-posix.c        Fri Dec 24 09:31:52 2010
@@ -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;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]