From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 40303 invoked by alias); 15 Jun 2018 17:37:35 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 40282 invoked by uid 89); 15 Jun 2018 17:37:34 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.5 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_PASS,URIBL_RED autolearn=ham version=3.3.2 spammy= X-HELO: relay1.mentorg.com Date: Fri, 15 Jun 2018 17:37:00 -0000 From: Joseph Myers To: Subject: Fix sign of NaN returned by strtod (bug 23007) [committed] Message-ID: User-Agent: Alpine 2.20 (DEB 67 2015-01-07) MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" X-ClientProxiedBy: svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) To svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) X-SW-Source: 2018-06/txt/msg00441.txt.bz2 As reported in bug 23007, strtod ignores any sign in the input string in the case of a NaN result. These patches (from the bug report in the case of the fix itself) fix this and add testcases. Tested for x86_64. Committed. 2018-06-15 Joseph Myers [BZ #23007] * stdlib/tst-strtod-nan-sign-main.c: New file. * stdlib/tst-strtod-nan-sign.c: Likewise. * wcsmbs/tst-wcstod-nan-sign.c: Likewise. * stdlib/Makefile (tests): Add tst-strtod-nan-sign. ($(objpfx)tst-strtod-nan-sign): Depend on $(libm). * wcsmbs/Makefile (tests) Add tst-wcstod-nan-sign. ($(objpfx)tst-wcstod-nan-sign): Depend on $(libm). 2018-06-15 Herman ten Brugge [BZ #23007] * stdlib/strtod_l.c (____STRTOF_INTERNAL): Return NaN of appropriate sign. diff --git a/stdlib/Makefile b/stdlib/Makefile index bf1fbd4..808a8ce 100644 --- a/stdlib/Makefile +++ b/stdlib/Makefile @@ -84,7 +84,7 @@ tests := tst-strtol tst-strtod testmb testrand testsort testdiv \ tst-cxa_atexit tst-on_exit test-atexit-race \ test-at_quick_exit-race test-cxa_atexit-race \ test-on_exit-race test-dlclose-exit-race \ - tst-makecontext-align test-bz22786 + tst-makecontext-align test-bz22786 tst-strtod-nan-sign tests-internal := tst-strtod1i tst-strtod3 tst-strtod4 tst-strtod5i \ tst-tls-atexit tst-tls-atexit-nodelete @@ -221,6 +221,7 @@ $(objpfx)tst-tininess: $(libm) $(objpfx)tst-strtod-underflow: $(libm) $(objpfx)tst-strtod6: $(libm) $(objpfx)tst-strtod-nan-locale: $(libm) +$(objpfx)tst-strtod-nan-sign: $(libm) tst-tls-atexit-lib.so-no-z-defs = yes test-dlclose-exit-race-helper.so-no-z-defs = yes diff --git a/stdlib/strtod_l.c b/stdlib/strtod_l.c index a09b093..cbff18b 100644 --- a/stdlib/strtod_l.c +++ b/stdlib/strtod_l.c @@ -678,7 +678,7 @@ ____STRTOF_INTERNAL (const STRING_TYPE *nptr, STRING_TYPE **endptr, int group, if (endptr != NULL) *endptr = (STRING_TYPE *) cp; - return retval; + return negative ? -retval : retval; } /* It is really a text we do not recognize. */ diff --git a/stdlib/tst-strtod-nan-sign-main.c b/stdlib/tst-strtod-nan-sign-main.c new file mode 100644 index 0000000..b168c64 --- /dev/null +++ b/stdlib/tst-strtod-nan-sign-main.c @@ -0,0 +1,50 @@ +/* Test strtod functions handle signs of NaNs (bug 23007). + Copyright (C) 2018 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include + +#include +#include + +#define CONCAT_(X, Y) X ## Y +#define CONCAT(X, Y) CONCAT_ (X, Y) +#define FNX(FN) CONCAT (FNPFX, FN) + +#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \ +static int \ +test_strto ## FSUF (void) \ +{ \ + FTYPE val_pos = FNX (FSUF) (L_("nan"), NULL); \ + FTYPE copy_pos = copysign ## CSUF (1, val_pos); \ + TEST_VERIFY (isnan (val_pos) && copy_pos == 1); \ + FTYPE val_neg = FNX (FSUF) (L_("-nan"), NULL); \ + FTYPE copy_neg = copysign ## CSUF (1, val_neg); \ + TEST_VERIFY (isnan (val_neg) && copy_neg == -1); \ + return 0; \ +} +GEN_TEST_STRTOD_FOREACH (TEST_STRTOD) + +static int +do_test (void) +{ + return STRTOD_TEST_FOREACH (test_strto); +} + +#include diff --git a/stdlib/tst-strtod-nan-sign.c b/stdlib/tst-strtod-nan-sign.c new file mode 100644 index 0000000..0b99932 --- /dev/null +++ b/stdlib/tst-strtod-nan-sign.c @@ -0,0 +1,23 @@ +/* Test strtod functions handle signs of NaNs (bug 23007). + Narrow string version. + Copyright (C) 2018 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#define FNPFX strto +#define L_(C) C + +#include diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile index 63a6fba..2e02b22 100644 --- a/wcsmbs/Makefile +++ b/wcsmbs/Makefile @@ -51,7 +51,7 @@ tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \ tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \ tst-c16c32-1 wcsatcliff tst-wcstol-locale tst-wcstod-nan-locale \ tst-wcstod-round test-char-types tst-fgetwc-after-eof \ - $(addprefix test-,$(strop-tests)) + tst-wcstod-nan-sign $(addprefix test-,$(strop-tests)) include ../Rules @@ -105,3 +105,4 @@ CPPFLAGS += $(libio-mtsafe) CPPFLAGS-wcstold_l.c += -I../stdlib $(objpfx)tst-wcstod-nan-locale: $(libm) +$(objpfx)tst-wcstod-nan-sign: $(libm) diff --git a/wcsmbs/tst-wcstod-nan-sign.c b/wcsmbs/tst-wcstod-nan-sign.c new file mode 100644 index 0000000..4c40e50 --- /dev/null +++ b/wcsmbs/tst-wcstod-nan-sign.c @@ -0,0 +1,23 @@ +/* Test strtod functions handle signs of NaNs (bug 23007). + Wide string version. + Copyright (C) 2018 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#define FNPFX wcsto +#define L_(C) L ## C + +#include "../stdlib/tst-strtod-nan-sign-main.c" -- Joseph S. Myers joseph@codesourcery.com