stdio-common: Add a few double formatting tests [BZ #27245]

Message ID 20210127044505.6783-1-mh@glandium.org
State Committed
Commit 5d5d71b898b35331f68b582a590bb27d3eb701e7
Delegated to: Adhemerval Zanella Netto
Headers
Series stdio-common: Add a few double formatting tests [BZ #27245] |

Commit Message

Mike Hommey Jan. 27, 2021, 4:45 a.m. UTC
  This adds tests for corner cases that I've found while implementing a
printf based on https://github.com/google/double-conversion/ but weren't
covered by the printf formatting tests in glibc (which I was using as a
source of test cases).

Copyright-paperwork-exempt: Yes
---
 stdio-common/tfformat.c | 30 +++++++++++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)
  

Comments

Adhemerval Zanella Jan. 29, 2021, 2:50 p.m. UTC | #1
On 27/01/2021 01:45, Mike Hommey wrote:
> This adds tests for corner cases that I've found while implementing a
> printf based on https://github.com/google/double-conversion/ but weren't
> covered by the printf formatting tests in glibc (which I was using as a
> source of test cases).
> 
> Copyright-paperwork-exempt: Yes

LGTM for 2.34.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

> ---
>  stdio-common/tfformat.c | 30 +++++++++++++++++++++++++++++-
>  1 file changed, 29 insertions(+), 1 deletion(-)
> 
> diff --git a/stdio-common/tfformat.c b/stdio-common/tfformat.c
> index 5cb366dd48..4eb47f0c2b 100644
> --- a/stdio-common/tfformat.c
> +++ b/stdio-common/tfformat.c
> @@ -1,3 +1,4 @@
> +#include <math.h>
>  #include <stdio.h>
>  
>  /* Tests taken from Cygnus C library. */
> @@ -4009,6 +4010,10 @@ sprint_double_type sprint_doubles[] =
>    {__LINE__, 11.25,			"11.2", "%.1f"},
>    {__LINE__, 1.75,			"1.8", "%.1f"},
>    {__LINE__, 11.75,			"11.8", "%.1f"},
> +  {__LINE__, -1.25,			"-1.2", "%.1f"},
> +  {__LINE__, -11.25,			"-11.2", "%.1f"},
> +  {__LINE__, -1.75,			"-1.8", "%.1f"},
> +  {__LINE__, -11.75,			"-11.8", "%.1f"},
>    {__LINE__, 16,			"0x1.0p+4", "%.1a"},
>    {__LINE__, 16,			"0x1.00000000000000000000p+4", "%.20a"},
>    {__LINE__, 4444.88888888,		"4445", "%2.F"},
> @@ -4039,6 +4044,29 @@ sprint_double_type sprint_doubles[] =
>    {__LINE__, 912.98,			"913", "%.4g"},
>    {__LINE__, 50.999999,			"51", "%.5g"},
>  
> +  {__LINE__, 0.0,			"0000.00000", "%010.5f"},
> +  {__LINE__, 0.0,			" 000.00000", "% 010.5f"},
> +  {__LINE__, -0.0,			"-000.00000", "% 010.5f"},
> +
> +  {__LINE__, NAN,			"nan", "%f"},
> +  {__LINE__, NAN,			"+nan", "%+f"},
> +  {__LINE__, NAN,			"       nan", "%010.2f"},
> +  {__LINE__, NAN,			"      +nan", "%+010.2f"},
> +  {__LINE__, -NAN,			"-nan", "%f"},
> +  {__LINE__, -NAN,			"-nan", "%+f"},
> +  {__LINE__, -NAN,			"      -nan", "%010.2f"},
> +  {__LINE__, -NAN,			"      -nan", "%+010.2f"},
> +  {__LINE__, NAN,			"NAN", "%F"},
> +  {__LINE__, INFINITY,			"inf", "%f"},
> +  {__LINE__, INFINITY,			"+inf", "%+f"},
> +  {__LINE__, INFINITY,			"       inf", "%010.2f"},
> +  {__LINE__, INFINITY,			"      +inf", "%+010.2f"},
> +  {__LINE__, -INFINITY,			"-inf", "%f"},
> +  {__LINE__, -INFINITY,			"-inf", "%+f"},
> +  {__LINE__, -INFINITY,			"      -inf", "%010.2f"},
> +  {__LINE__, -INFINITY,			"      -inf", "%+010.2f"},
> +  {__LINE__, INFINITY,			"INF", "%F"},
> +
>    {0 }
>  
>  };
> @@ -4090,7 +4118,7 @@ int main(int argc, char *argv[])
>  
>        sprintf (buffer, "%.999g", dptr->value);
>        sscanf (buffer, "%lg", &d);
> -      if (dptr->value != d)
> +      if (dptr->value != d && !isnan(d))
>  	{
>  	  errcount++;
>  	  printf ("Error in line %d.  String is \"%s\", value is %g.\n",
> 

Maybe bail out early in the loop, like:

  if (isnan (d))
    continue;
 
  sprintf (...)
  
Mike Hommey Feb. 4, 2021, 8:03 a.m. UTC | #2
On Fri, Jan 29, 2021 at 11:50:30AM -0300, Adhemerval Zanella wrote:
> 
> 
> On 27/01/2021 01:45, Mike Hommey wrote:
> > This adds tests for corner cases that I've found while implementing a
> > printf based on https://github.com/google/double-conversion/ but weren't
> > covered by the printf formatting tests in glibc (which I was using as a
> > source of test cases).
> > 
> > Copyright-paperwork-exempt: Yes
> 
> LGTM for 2.34.
> 
> Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
>
> (...)
> 
> Maybe bail out early in the loop, like:
> 
>   if (isnan (d))
>     continue;
>  
>   sprintf (...)

That would skip the testcount++.

Would you commit this for me? (I'm not a committer)

Thank you

Mike
  

Patch

diff --git a/stdio-common/tfformat.c b/stdio-common/tfformat.c
index 5cb366dd48..4eb47f0c2b 100644
--- a/stdio-common/tfformat.c
+++ b/stdio-common/tfformat.c
@@ -1,3 +1,4 @@ 
+#include <math.h>
 #include <stdio.h>
 
 /* Tests taken from Cygnus C library. */
@@ -4009,6 +4010,10 @@  sprint_double_type sprint_doubles[] =
   {__LINE__, 11.25,			"11.2", "%.1f"},
   {__LINE__, 1.75,			"1.8", "%.1f"},
   {__LINE__, 11.75,			"11.8", "%.1f"},
+  {__LINE__, -1.25,			"-1.2", "%.1f"},
+  {__LINE__, -11.25,			"-11.2", "%.1f"},
+  {__LINE__, -1.75,			"-1.8", "%.1f"},
+  {__LINE__, -11.75,			"-11.8", "%.1f"},
   {__LINE__, 16,			"0x1.0p+4", "%.1a"},
   {__LINE__, 16,			"0x1.00000000000000000000p+4", "%.20a"},
   {__LINE__, 4444.88888888,		"4445", "%2.F"},
@@ -4039,6 +4044,29 @@  sprint_double_type sprint_doubles[] =
   {__LINE__, 912.98,			"913", "%.4g"},
   {__LINE__, 50.999999,			"51", "%.5g"},
 
+  {__LINE__, 0.0,			"0000.00000", "%010.5f"},
+  {__LINE__, 0.0,			" 000.00000", "% 010.5f"},
+  {__LINE__, -0.0,			"-000.00000", "% 010.5f"},
+
+  {__LINE__, NAN,			"nan", "%f"},
+  {__LINE__, NAN,			"+nan", "%+f"},
+  {__LINE__, NAN,			"       nan", "%010.2f"},
+  {__LINE__, NAN,			"      +nan", "%+010.2f"},
+  {__LINE__, -NAN,			"-nan", "%f"},
+  {__LINE__, -NAN,			"-nan", "%+f"},
+  {__LINE__, -NAN,			"      -nan", "%010.2f"},
+  {__LINE__, -NAN,			"      -nan", "%+010.2f"},
+  {__LINE__, NAN,			"NAN", "%F"},
+  {__LINE__, INFINITY,			"inf", "%f"},
+  {__LINE__, INFINITY,			"+inf", "%+f"},
+  {__LINE__, INFINITY,			"       inf", "%010.2f"},
+  {__LINE__, INFINITY,			"      +inf", "%+010.2f"},
+  {__LINE__, -INFINITY,			"-inf", "%f"},
+  {__LINE__, -INFINITY,			"-inf", "%+f"},
+  {__LINE__, -INFINITY,			"      -inf", "%010.2f"},
+  {__LINE__, -INFINITY,			"      -inf", "%+010.2f"},
+  {__LINE__, INFINITY,			"INF", "%F"},
+
   {0 }
 
 };
@@ -4090,7 +4118,7 @@  int main(int argc, char *argv[])
 
       sprintf (buffer, "%.999g", dptr->value);
       sscanf (buffer, "%lg", &d);
-      if (dptr->value != d)
+      if (dptr->value != d && !isnan(d))
 	{
 	  errcount++;
 	  printf ("Error in line %d.  String is \"%s\", value is %g.\n",