NetBSD-Bugs archive

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

Re: lib/57250: dtoa mishandles infinite doubles on 32bit big endian machines



The following reply was made to PR lib/57250; it has been noted by GNATS.

From: Havard Eidnes <he%NetBSD.org@localhost>
To: gnats-bugs%netbsd.org@localhost, martin%duskware.de@localhost
Cc: lib-bug-people%netbsd.org@localhost, gnats-admin%netbsd.org@localhost,
 netbsd-bugs%netbsd.org@localhost, martin%NetBSD.org@localhost
Subject: Re: lib/57250: dtoa mishandles infinite doubles on 32bit big
 endian machines
Date: Tue, 04 Apr 2023 21:22:27 +0200 (CEST)

 ...and here's a minimal test modification:
 
 Index: t_printf.c
 ===================================================================
 RCS file: /cvsroot/src/tests/lib/libc/stdio/t_printf.c,v
 retrieving revision 1.8
 diff -u -p -r1.8 t_printf.c
 --- t_printf.c	11 Apr 2012 16:21:42 -0000	1.8
 +++ t_printf.c	4 Apr 2023 19:21:28 -0000
 @@ -35,6 +35,7 @@
  #include <string.h>
  #include <time.h>
  #include <stdlib.h>
 +#include <errno.h>
  
  ATF_TC(snprintf_c99);
  ATF_TC_HEAD(snprintf_c99, tc)
 @@ -155,6 +156,49 @@ ATF_TC_BODY(snprintf_float, tc)
  	}
  }
  
 +ATF_TC(snprintf_double_a);
 +ATF_TC_HEAD(snprintf_double_a, tc)
 +{
 +	atf_tc_set_md_var(tc, "descr", "Test printf a format");
 +}
 +
 +ATF_TC_BODY(snprintf_double_a, tc)
 +{
 +	char buf[1000];
 +
 +	snprintf(buf, sizeof buf, "%.3a", (double)10.6);
 +	ATF_REQUIRE_STREQ("0x1.533p+3", buf);
 +}
 +
 +/* is "long double" and "double" different? */
 +#if (__LDBL_MANT_DIG__ != __DBL_MANT_DIG__) || \
 +    (__LDBL_MAX_EXP__ != __DBL_MAX_EXP__)
 +#define WIDE_DOUBLE
 +#endif
 +
 +#ifndef WIDE_DOUBLE
 +ATF_TC(pr57250_fix);
 +ATF_TC_HEAD(pr57250_fix, tc)
 +{
 +	atf_tc_set_md_var(tc, "descr", "Test for PR57250");
 +}
 +
 +ATF_TC_BODY(pr57250_fix, tc)
 +{
 +	char *eptr;
 +	char buf[1000];
 +	long double ld;
 +
 +	errno = 0;
 +	ld = strtold("1e309", &eptr);
 +	ATF_CHECK(errno != 0);
 +	ld = (double)ld;
 +	ATF_CHECK(isfinite(ld) == 0);
 +	snprintf(buf, sizeof buf, "%Lf\n", ld);
 +	ATF_REQUIRE_STREQ(buf, "inf");
 +}
 +#endif
 +
  ATF_TC(sprintf_zeropad);
  ATF_TC_HEAD(sprintf_zeropad, tc)
  {
 @@ -189,6 +233,10 @@ ATF_TP_ADD_TCS(tp)
  	ATF_TP_ADD_TC(tp, snprintf_posarg_error);
  	ATF_TP_ADD_TC(tp, snprintf_float);
  	ATF_TP_ADD_TC(tp, sprintf_zeropad);
 +	ATF_TP_ADD_TC(tp, snprintf_double_a);
 +#ifndef WIDE_DOUBLE
 +	ATF_TP_ADD_TC(tp, pr57250_fix);
 +#endif
  
  	return atf_no_error();
  }
 


Home | Main Index | Thread Index | Old Index