From b12c1e7991cbde3d6fc70abfdf72abecce8b318c Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Fri, 15 Jun 2018 17:36:21 +0000 Subject: [PATCH] Add tests for sign of NaN returned by strtod (bug 23007). This patch adds tests for bug 23007, strtod ignoring any sign in the input string in the case of a NaN result. Tested for x86_64. [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). --- ChangeLog | 11 +++++++++ stdlib/Makefile | 3 ++- stdlib/tst-strtod-nan-sign-main.c | 50 +++++++++++++++++++++++++++++++++++++++ stdlib/tst-strtod-nan-sign.c | 23 ++++++++++++++++++ wcsmbs/Makefile | 3 ++- wcsmbs/tst-wcstod-nan-sign.c | 23 ++++++++++++++++++ 6 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 stdlib/tst-strtod-nan-sign-main.c create mode 100644 stdlib/tst-strtod-nan-sign.c create mode 100644 wcsmbs/tst-wcstod-nan-sign.c diff --git a/ChangeLog b/ChangeLog index c0f58f5..a8f711f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +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] 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/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" -- 2.7.4