From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 88796 invoked by alias); 4 Nov 2019 15:43:20 -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 88786 invoked by uid 89); 4 Nov 2019 15:43:20 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-22.9 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.1 spammy= X-HELO: mx0a-001b2d01.pphosted.com Subject: Re: [PATCH v2 03/30] ldbl-128ibm-compat: Add regular character, fortified printing functions To: "Gabriel F. T. Gomes" , libc-alpha@sourceware.org References: <20191025153410.15405-1-gabriel@inconstante.net.br> <20191025153410.15405-4-gabriel@inconstante.net.br> From: Paul E Murphy Message-ID: Date: Mon, 04 Nov 2019 15:43:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.1.0 MIME-Version: 1.0 In-Reply-To: <20191025153410.15405-4-gabriel@inconstante.net.br> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2019-11/txt/msg00071.txt.bz2 On 10/25/19 10:33 AM, Gabriel F. T. Gomes wrote: > From: "Gabriel F. T. Gomes" > > No changes since v1. > > -- 8< -- > Since the introduction of internal functions with explicit flags for the > printf family of functions, the 'mode' parameter can be used to select > which format long double parameters have (with the mode flags: > PRINTF_LDBL_IS_DBL and PRINTF_LDBL_USES_FLOAT128), as well as to select > whether to check for overflows (mode flag: PRINTF_FORTIFY). > > This patch combines PRINTF_LDBL_USES_FLOAT128 and PRINTF_FORTIFY to > provide the IEEE binary128 version of printf-like function for platforms > where long double can take this format, in addition to the double format > and to some non-ieee format (currently, this means powerpc64le). > > There are two flavors of test cases provided with this patch: one that > explicitly calls the fortified functions, for instance __asprintf_chk, > and another that reuses the non-fortified test, but defining > _FORTIFY_SOURCE as 2. The first guarantees that the implementations are > actually being tested (in bits/stdio2.h, vprintf gets redirected to > __vfprintf_chk, which would leave __vprintf_chk untested), whereas the > second guarantees that the redirections calls the correct function in > the IBM and IEEE long double cases. > > Tested for powerpc64le. > --- > sysdeps/ieee754/ldbl-128ibm-compat/Makefile | 25 +++ > sysdeps/ieee754/ldbl-128ibm-compat/Versions | 14 ++ > .../ldbl-128ibm-compat/ieee128-asprintf_chk.c | 38 ++++ > .../ldbl-128ibm-compat/ieee128-dprintf_chk.c | 38 ++++ > .../ldbl-128ibm-compat/ieee128-fprintf_chk.c | 38 ++++ > .../ldbl-128ibm-compat/ieee128-printf_chk.c | 38 ++++ > .../ldbl-128ibm-compat/ieee128-snprintf_chk.c | 42 ++++ > .../ldbl-128ibm-compat/ieee128-sprintf_chk.c | 42 ++++ > .../ieee128-vasprintf_chk.c | 31 +++ > .../ldbl-128ibm-compat/ieee128-vdprintf_chk.c | 30 +++ > .../ldbl-128ibm-compat/ieee128-vfprintf_chk.c | 30 +++ > .../ldbl-128ibm-compat/ieee128-vprintf_chk.c | 30 +++ > .../ieee128-vsnprintf_chk.c | 34 ++++ > .../ldbl-128ibm-compat/ieee128-vsprintf_chk.c | 34 ++++ > .../test-printf-chk-ibm128.c | 1 + > .../test-printf-chk-ieee128.c | 1 + > .../test-printf-chk-ldbl-compat.c | 179 ++++++++++++++++++ > .../test-printf-chk-redir-ibm128.c | 2 + > .../test-printf-chk-redir-ieee128.c | 2 + > 19 files changed, 649 insertions(+) > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf_chk.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-dprintf_chk.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fprintf_chk.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-printf_chk.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-snprintf_chk.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-sprintf_chk.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vasprintf_chk.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vdprintf_chk.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vfprintf_chk.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vprintf_chk.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsnprintf_chk.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsprintf_chk.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-ibm128.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-ieee128.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-ldbl-compat.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-redir-ibm128.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-redir-ieee128.c > > diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile > diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Versions b/sysdeps/ieee754/ldbl-128ibm-compat/Versions These changes look OK. > diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf_chk.c > new file mode 100644 > index 0000000000..149fc046b6 > --- /dev/null > +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf_chk.c The 12 wrappers look OK, and suspiciously similar to the ndbl-64 code :). > diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-ibm128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-ibm128.c > new file mode 100644 > index 0000000000..7d50284d9c > --- /dev/null > +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-ibm128.c > @@ -0,0 +1 @@ > +#include > diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-ieee128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-ieee128.c > new file mode 100644 > index 0000000000..7d50284d9c > --- /dev/null > +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-ieee128.c > @@ -0,0 +1 @@ > +#include > diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-ldbl-compat.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-ldbl-compat.c > new file mode 100644 > index 0000000000..f3d18c92ec > --- /dev/null > +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-ldbl-compat.c > @@ -0,0 +1,179 @@ > +/* Test for the long double variants of *printf_chk functions. > + 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 _FORTIFY_SOURCE 2 > + > +#include > +#include > +#include > +#include > + > +#include > +#include > + > +static void > +do_test_call_varg (FILE *stream, const char *format, ...) > +{ > + char *buffer = NULL; > + char string[128]; > + int res; > + va_list args; > + > + printf ("%20s", "__vasprintf_chk: "); > + va_start (args, format); > + res = __vasprintf_chk (&buffer, 1, format, args); > + va_end (args); > + if (res == -1) > + printf ("Error using vasprintf\n"); > + if (buffer == NULL) > + printf ("Error using vasprintf\n"); > + else > + { > + printf ("%s", buffer); > + free (buffer); > + } > + printf ("\n"); > + > + printf ("%20s", "__vdprintf_chk: "); > + va_start (args, format); > + __vdprintf_chk (fileno (stream), 1, format, args); > + va_end (args); > + printf ("\n"); > + > + printf ("%20s", "__vfprintf_chk: "); > + va_start (args, format); > + __vfprintf_chk (stream, 1, format, args); > + va_end (args); > + printf ("\n"); > + > + printf ("%20s", "__vprintf_chk: "); > + va_start (args, format); > + __vprintf_chk (1, format, args); > + va_end (args); > + printf ("\n"); > + > + printf ("%20s", "__vsnprintf_chk: "); > + va_start (args, format); > + __vsnprintf_chk (string, 79, 1, 127, format, args); > + va_end (args); > + printf ("%s", string); > + printf ("\n"); > + > + printf ("%20s", "__vsprintf_chk: "); > + va_start (args, format); > + __vsprintf_chk (string, 1, 127, format, args); > + va_end (args); > + printf ("%s", string); > + printf ("\n"); > +} > + > +static void > +do_test_call_rarg (FILE *stream, const char *format, long double ld) > +{ > + char *buffer = NULL; > + char string[128]; > + int res; > + > + printf ("%20s", "__asprintf_chk: "); > + res = __asprintf_chk (&buffer, 1, format, ld); > + if (res == -1) > + printf ("Error using vasprintf\n"); > + if (buffer == NULL) > + printf ("Error using asprintf\n"); > + else > + { > + printf ("%s", buffer); > + free (buffer); > + } > + printf ("\n"); > + > + printf ("%20s", "__dprintf_chk: "); > + __dprintf_chk (fileno (stream), 1, format, ld); > + printf ("\n"); > + > + printf ("%20s", "__fprintf_chk: "); > + __fprintf_chk (stdout, 1, format, ld); > + printf ("\n"); > + > + printf ("%20s", "__printf_chk: "); > + __printf_chk (1, format, ld); > + printf ("\n"); > + > + printf ("%20s", "__snprintf_chk: "); > + __snprintf_chk (string, 79, 1, 127, format, ld); > + printf ("%s", string); > + printf ("\n"); > + > + printf ("%20s", "__sprintf_chk: "); > + __sprintf_chk (string, 1, 127, format, ld); > + printf ("%s", string); > + printf ("\n"); > +} > + > +static void > +do_test_call (void) > +{ > + long double ld = -1; > + > + /* Print in decimal notation. */ > + do_test_call_rarg (stdout, "%.10Lf", ld); > + do_test_call_varg (stdout, "%.10Lf", ld); > + > + /* Print in hexadecimal notation. */ > + do_test_call_rarg (stdout, "%.10La", ld); > + do_test_call_varg (stdout, "%.10La", ld); > +} > + > +static int > +do_test (void) > +{ > + struct support_capture_subprocess result; > + result = support_capture_subprocess ((void *) &do_test_call, NULL); > + > + /* Compare against the expected output. */ > + const char *expected = > + " __asprintf_chk: -1.0000000000\n" > + " __dprintf_chk: -1.0000000000\n" > + " __fprintf_chk: -1.0000000000\n" > + " __printf_chk: -1.0000000000\n" > + " __snprintf_chk: -1.0000000000\n" > + " __sprintf_chk: -1.0000000000\n" > + " __vasprintf_chk: -1.0000000000\n" > + " __vdprintf_chk: -1.0000000000\n" > + " __vfprintf_chk: -1.0000000000\n" > + " __vprintf_chk: -1.0000000000\n" > + " __vsnprintf_chk: -1.0000000000\n" > + " __vsprintf_chk: -1.0000000000\n" > + " __asprintf_chk: -0x1.0000000000p+0\n" > + " __dprintf_chk: -0x1.0000000000p+0\n" > + " __fprintf_chk: -0x1.0000000000p+0\n" > + " __printf_chk: -0x1.0000000000p+0\n" > + " __snprintf_chk: -0x1.0000000000p+0\n" > + " __sprintf_chk: -0x1.0000000000p+0\n" > + " __vasprintf_chk: -0x1.0000000000p+0\n" > + " __vdprintf_chk: -0x1.0000000000p+0\n" > + " __vfprintf_chk: -0x1.0000000000p+0\n" > + " __vprintf_chk: -0x1.0000000000p+0\n" > + " __vsnprintf_chk: -0x1.0000000000p+0\n" > + " __vsprintf_chk: -0x1.0000000000p+0\n"; > + TEST_COMPARE_STRING (expected, result.out.buffer); > + > + return 0; > +} > + > +#include OK > diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-redir-ibm128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-redir-ibm128.c > new file mode 100644 > index 0000000000..aeab22412b > --- /dev/null > +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-redir-ibm128.c > @@ -0,0 +1,2 @@ > +#define _FORTIFY_SOURCE 2 This is also defined in the unified test case above. Is it necessary here to? > +#include > diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-redir-ieee128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-redir-ieee128.c > new file mode 100644 > index 0000000000..aeab22412b > --- /dev/null > +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-chk-redir-ieee128.c > @@ -0,0 +1,2 @@ > +#define _FORTIFY_SOURCE 2 Likewise. > +#include >