[v3.1,02/12] stdio-common: Add tests for formatted asprintf output specifiers

Message ID alpine.DEB.2.21.2410162037090.40463@angie.orcam.me.uk (mailing list archive)
State Superseded
Headers
Series stdio-common: Add tests for formatted printf output specifiers |

Checks

Context Check Description
redhat-pt-bot/TryBot-apply_patch success Patch applied to master at the time it was sent
linaro-tcwg-bot/tcwg_glibc_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_glibc_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_glibc_check--master-aarch64 success Test passed
linaro-tcwg-bot/tcwg_glibc_check--master-arm success Test passed

Commit Message

Maciej W. Rozycki Oct. 16, 2024, 7:50 p.m. UTC
  From: Maciej W. Rozycki <macro@redhat.com>

Wire asprintf into test infrastructure for formatted printf output 
specifiers.

Owing to mtrace logging of lots of memory allocation calls these tests 
take a considerable amount of time to complete, except for the character 
conversion, taking from 00m51s for 'tst-printf-format-as-s --direct s', 
through 03m23s and 09m21s for 'tst-printf-format-as-char --direct i' and 
'tst-printf-format-as-double --direct f' respectively, to 31m35s for 
'tst-printf-format-as-ldouble --direct f', all in standalone execution 
from NFS on a RISC-V FU740@1.2GHz system and with output redirected over 
100Mbps network via SSH.

Set timeouts for the tests accordingly then, with a global default for 
all the asprintf tests, and then individual higher settings for double 
and long double tests each.
---
New change in v3.
---
 stdio-common/Makefile                       |    2 -
 stdio-common/tst-printf-format-as-c.c       |   20 ++++++++++++
 stdio-common/tst-printf-format-as-char.c    |   20 ++++++++++++
 stdio-common/tst-printf-format-as-double.c  |   22 +++++++++++++
 stdio-common/tst-printf-format-as-int.c     |   20 ++++++++++++
 stdio-common/tst-printf-format-as-ldouble.c |   22 +++++++++++++
 stdio-common/tst-printf-format-as-llong.c   |   20 ++++++++++++
 stdio-common/tst-printf-format-as-long.c    |   20 ++++++++++++
 stdio-common/tst-printf-format-as-s.c       |   20 ++++++++++++
 stdio-common/tst-printf-format-as-short.c   |   20 ++++++++++++
 stdio-common/tst-printf-format-as-uchar.c   |   20 ++++++++++++
 stdio-common/tst-printf-format-as-uint.c    |   20 ++++++++++++
 stdio-common/tst-printf-format-as-ullong.c  |   20 ++++++++++++
 stdio-common/tst-printf-format-as-ulong.c   |   20 ++++++++++++
 stdio-common/tst-printf-format-as-ushort.c  |   20 ++++++++++++
 stdio-common/tst-printf-format-as.h         |   46 ++++++++++++++++++++++++++++
 16 files changed, 331 insertions(+), 1 deletion(-)

glibc-tst-printf-format-all-asprintf.diff
  

Comments

Florian Weimer Oct. 29, 2024, 2:26 p.m. UTC | #1
* Maciej W. Rozycki:

> From: Maciej W. Rozycki <macro@redhat.com>
>
> Wire asprintf into test infrastructure for formatted printf output 
> specifiers.
>
> Owing to mtrace logging of lots of memory allocation calls these tests 
> take a considerable amount of time to complete, except for the character 
> conversion, taking from 00m51s for 'tst-printf-format-as-s --direct s', 
> through 03m23s and 09m21s for 'tst-printf-format-as-char --direct i' and 
> 'tst-printf-format-as-double --direct f' respectively, to 31m35s for 
> 'tst-printf-format-as-ldouble --direct f', all in standalone execution 
> from NFS on a RISC-V FU740@1.2GHz system and with output redirected over 
> 100Mbps network via SSH.

You could try stubbing out the dladdr call in mtrace:

diff --git a/malloc/mtrace-impl.c b/malloc/mtrace-impl.c
index ee2985388a..61ef634b82 100644
--- a/malloc/mtrace-impl.c
+++ b/malloc/mtrace-impl.c
@@ -78,7 +78,7 @@ lock_and_info (const void *caller, Dl_info *mem)
   if (caller == NULL)
     return NULL;
 
-  Dl_info *res = dladdr (caller, mem) ? mem : NULL;
+  Dl_info *res = NULL;
 
   flockfile (mallstream);
 
Does this improve performance?  We rarely need this kind of symbol
information, so we could disable it with another environment variable
for mtrace.

For me, the improvement across the entire stdio-common subdirectory is
there, but really significant.  With dladdr (just for running the
already-built tests):

real    1m9.464s
user    26m44.415s
sys     3m29.158s

Without dladdr:

real    1m6.239s
user    25m49.850s
sys     2m30.518s

Thanks,
Florian
  
Florian Weimer Oct. 30, 2024, 4:27 p.m. UTC | #2
* Maciej W. Rozycki:

> +#define printf_under_test(...)						\
> +({									\
> +  __label__ out;							\
> +  int result;								\
> +  char *str;								\
> +									\
> +  result = asprintf (&str, __VA_ARGS__);				\
> +  if (result < 0)							\
> +    {									\
> +      perror ("asprintf");						\
> +      goto out;								\
> +    }									\
> +  if (fwrite (str, sizeof (*str), result, stdout) != result)		\
> +    {									\
> +      perror ("fwrite");						\
> +      result = -1;							\
> +    }									\
> +  free (str);								\

This doesn't test the return value against the length of a string.  It
may not be accurately possible for %c and null bytes, but for most
conversions, it is.  If we are not verifying the pecularities of the
different exterbak printf interfaces, then I'm not sure why we have to
test all of them.  In the current implementation, the external interface
does not really impact the formatting anymore because we lower
operations at the printf buffer layer.  For example, we turn padding
into memset calls, rather than letting libio handle the padding via
_IO_padn.  Previously, there was considerable variance among the libio
vtable implementations.

Thanks,
Florian
  
Maciej W. Rozycki Oct. 31, 2024, 7:59 p.m. UTC | #3
On Tue, 29 Oct 2024, Florian Weimer wrote:

> > Owing to mtrace logging of lots of memory allocation calls these tests 
> > take a considerable amount of time to complete, except for the character 
> > conversion, taking from 00m51s for 'tst-printf-format-as-s --direct s', 
> > through 03m23s and 09m21s for 'tst-printf-format-as-char --direct i' and 
> > 'tst-printf-format-as-double --direct f' respectively, to 31m35s for 
> > 'tst-printf-format-as-ldouble --direct f', all in standalone execution 
> > from NFS on a RISC-V FU740@1.2GHz system and with output redirected over 
> > 100Mbps network via SSH.
> 
> You could try stubbing out the dladdr call in mtrace:
> 
> diff --git a/malloc/mtrace-impl.c b/malloc/mtrace-impl.c
> index ee2985388a..61ef634b82 100644
> --- a/malloc/mtrace-impl.c
> +++ b/malloc/mtrace-impl.c
> @@ -78,7 +78,7 @@ lock_and_info (const void *caller, Dl_info *mem)
>    if (caller == NULL)
>      return NULL;
>  
> -  Dl_info *res = dladdr (caller, mem) ? mem : NULL;
> +  Dl_info *res = NULL;
>  
>    flockfile (mallstream);
>  
> Does this improve performance?  We rarely need this kind of symbol
> information, so we could disable it with another environment variable
> for mtrace.

 This is an external symbol reference and we have total control over all 
the pieces involved in a test run, so I chose just to interpose it with a 
stub implementation in the shared skeleton.  There's nothing else in these 
tests that relies on `dladdr', so I think it's a safe and minimal impact 
approach.

> For me, the improvement across the entire stdio-common subdirectory is
> there, but really significant.  With dladdr (just for running the
> already-built tests):
> 
> real    1m9.464s
> user    26m44.415s
> sys     3m29.158s
> 
> Without dladdr:
> 
> real    1m6.239s
> user    25m49.850s
> sys     2m30.518s

 Well, it has more than halved the execution time for several conversions 
and shaved off the third of it with the longest long double one with the 
RISC-V setup involved, lowering the total -j 4 elapsed execution time for 
stdio-common/ from ~4h21m to ~2h41m, so it's well worth it.

 Thanks for the hint, I've rerun verification and posted v4 now with the 
relevant updates.

  Maciej
  
Maciej W. Rozycki Oct. 31, 2024, 8 p.m. UTC | #4
On Wed, 30 Oct 2024, Florian Weimer wrote:

> > +#define printf_under_test(...)						\
> > +({									\
> > +  __label__ out;							\
> > +  int result;								\
> > +  char *str;								\
> > +									\
> > +  result = asprintf (&str, __VA_ARGS__);				\
> > +  if (result < 0)							\
> > +    {									\
> > +      perror ("asprintf");						\
> > +      goto out;								\
> > +    }									\
> > +  if (fwrite (str, sizeof (*str), result, stdout) != result)		\
> > +    {									\
> > +      perror ("fwrite");						\
> > +      result = -1;							\
> > +    }									\
> > +  free (str);								\
> 
> This doesn't test the return value against the length of a string.

 Good point.  However the return value is actually verified, although 
indeed not here.

 Please observe that it is passed as an argument to fwrite(3), so the 
number of characters produced to stdout will match it exactly, and then 
the receiver (the GAWK script) will match input received against the 
reference character sequence.  If there is a mismatch in the length 
between the two character sequences, the test will fail, and therefore 
indirectly verify the return value produced here, including the 
problematic null character case with %c.

 I hope this clears your concern and please do let me know if you still 
have any.  Thank you for your meticulousness!

  Maciej
  

Patch

Index: glibc/stdio-common/Makefile
===================================================================
--- glibc.orig/stdio-common/Makefile
+++ glibc/stdio-common/Makefile
@@ -23,7 +23,7 @@  subdir	:= stdio-common
 include ../Makeconfig
 
 # List of markers for printf family function tests.
-xprintf-funcs := p
+xprintf-funcs := p as
 
 # List of data types and formats for individual per-conversion printf tests.
 fmt-convs := double ldouble
Index: glibc/stdio-common/tst-printf-format-as-c.c
===================================================================
--- /dev/null
+++ glibc/stdio-common/tst-printf-format-as-c.c
@@ -0,0 +1,20 @@ 
+/* Test for formatted 'asprintf' output for the 'c' conversion.
+   Copyright (C) 2024 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
+   <https://www.gnu.org/licenses/>.  */
+
+#include "tst-printf-format-as.h"
+#include "tst-printf-format-skeleton-c.c"
Index: glibc/stdio-common/tst-printf-format-as-char.c
===================================================================
--- /dev/null
+++ glibc/stdio-common/tst-printf-format-as-char.c
@@ -0,0 +1,20 @@ 
+/* Test for formatted 'asprintf' output for signed char conversions.
+   Copyright (C) 2024 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
+   <https://www.gnu.org/licenses/>.  */
+
+#include "tst-printf-format-as.h"
+#include "tst-printf-format-skeleton-char.c"
Index: glibc/stdio-common/tst-printf-format-as-double.c
===================================================================
--- /dev/null
+++ glibc/stdio-common/tst-printf-format-as-double.c
@@ -0,0 +1,22 @@ 
+/* Test for formatted 'asprintf' output for double conversions.
+   Copyright (C) 2024 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
+   <https://www.gnu.org/licenses/>.  */
+
+#define TIMEOUT (DEFAULT_TIMEOUT * 64)
+
+#include "tst-printf-format-as.h"
+#include "tst-printf-format-skeleton-double.c"
Index: glibc/stdio-common/tst-printf-format-as-int.c
===================================================================
--- /dev/null
+++ glibc/stdio-common/tst-printf-format-as-int.c
@@ -0,0 +1,20 @@ 
+/* Test for formatted 'asprintf' output for int conversions.
+   Copyright (C) 2024 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
+   <https://www.gnu.org/licenses/>.  */
+
+#include "tst-printf-format-as.h"
+#include "tst-printf-format-skeleton-int.c"
Index: glibc/stdio-common/tst-printf-format-as-ldouble.c
===================================================================
--- /dev/null
+++ glibc/stdio-common/tst-printf-format-as-ldouble.c
@@ -0,0 +1,22 @@ 
+/* Test for formatted 'asprintf' output for long double conversions.
+   Copyright (C) 2024 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
+   <https://www.gnu.org/licenses/>.  */
+
+#define TIMEOUT (DEFAULT_TIMEOUT * 192)
+
+#include "tst-printf-format-as.h"
+#include "tst-printf-format-skeleton-ldouble.c"
Index: glibc/stdio-common/tst-printf-format-as-llong.c
===================================================================
--- /dev/null
+++ glibc/stdio-common/tst-printf-format-as-llong.c
@@ -0,0 +1,20 @@ 
+/* Test for formatted 'asprintf' output for long long int conversions.
+   Copyright (C) 2024 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
+   <https://www.gnu.org/licenses/>.  */
+
+#include "tst-printf-format-as.h"
+#include "tst-printf-format-skeleton-llong.c"
Index: glibc/stdio-common/tst-printf-format-as-long.c
===================================================================
--- /dev/null
+++ glibc/stdio-common/tst-printf-format-as-long.c
@@ -0,0 +1,20 @@ 
+/* Test for formatted 'asprintf' output for long int conversions.
+   Copyright (C) 2024 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
+   <https://www.gnu.org/licenses/>.  */
+
+#include "tst-printf-format-as.h"
+#include "tst-printf-format-skeleton-long.c"
Index: glibc/stdio-common/tst-printf-format-as-s.c
===================================================================
--- /dev/null
+++ glibc/stdio-common/tst-printf-format-as-s.c
@@ -0,0 +1,20 @@ 
+/* Test for formatted 'asprintf' output for the 's' conversion.
+   Copyright (C) 2024 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
+   <https://www.gnu.org/licenses/>.  */
+
+#include "tst-printf-format-as.h"
+#include "tst-printf-format-skeleton-s.c"
Index: glibc/stdio-common/tst-printf-format-as-short.c
===================================================================
--- /dev/null
+++ glibc/stdio-common/tst-printf-format-as-short.c
@@ -0,0 +1,20 @@ 
+/* Test for formatted 'asprintf' output for short int conversions.
+   Copyright (C) 2024 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
+   <https://www.gnu.org/licenses/>.  */
+
+#include "tst-printf-format-as.h"
+#include "tst-printf-format-skeleton-short.c"
Index: glibc/stdio-common/tst-printf-format-as-uchar.c
===================================================================
--- /dev/null
+++ glibc/stdio-common/tst-printf-format-as-uchar.c
@@ -0,0 +1,20 @@ 
+/* Test for formatted 'asprintf' output for unsigned char conversions.
+   Copyright (C) 2024 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
+   <https://www.gnu.org/licenses/>.  */
+
+#include "tst-printf-format-as.h"
+#include "tst-printf-format-skeleton-uchar.c"
Index: glibc/stdio-common/tst-printf-format-as-uint.c
===================================================================
--- /dev/null
+++ glibc/stdio-common/tst-printf-format-as-uint.c
@@ -0,0 +1,20 @@ 
+/* Test for formatted 'asprintf' output for unsigned int conversions.
+   Copyright (C) 2024 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
+   <https://www.gnu.org/licenses/>.  */
+
+#include "tst-printf-format-as.h"
+#include "tst-printf-format-skeleton-uint.c"
Index: glibc/stdio-common/tst-printf-format-as-ullong.c
===================================================================
--- /dev/null
+++ glibc/stdio-common/tst-printf-format-as-ullong.c
@@ -0,0 +1,20 @@ 
+/* Test for formatted 'asprintf' output for unsigned long long int conversions.
+   Copyright (C) 2024 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
+   <https://www.gnu.org/licenses/>.  */
+
+#include "tst-printf-format-as.h"
+#include "tst-printf-format-skeleton-ullong.c"
Index: glibc/stdio-common/tst-printf-format-as-ulong.c
===================================================================
--- /dev/null
+++ glibc/stdio-common/tst-printf-format-as-ulong.c
@@ -0,0 +1,20 @@ 
+/* Test for formatted 'asprintf' output for unsigned long int conversions.
+   Copyright (C) 2024 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
+   <https://www.gnu.org/licenses/>.  */
+
+#include "tst-printf-format-as.h"
+#include "tst-printf-format-skeleton-ulong.c"
Index: glibc/stdio-common/tst-printf-format-as-ushort.c
===================================================================
--- /dev/null
+++ glibc/stdio-common/tst-printf-format-as-ushort.c
@@ -0,0 +1,20 @@ 
+/* Test for formatted 'asprintf' output for unsigned short int conversions.
+   Copyright (C) 2024 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
+   <https://www.gnu.org/licenses/>.  */
+
+#include "tst-printf-format-as.h"
+#include "tst-printf-format-skeleton-ushort.c"
Index: glibc/stdio-common/tst-printf-format-as.h
===================================================================
--- /dev/null
+++ glibc/stdio-common/tst-printf-format-as.h
@@ -0,0 +1,46 @@ 
+/* Test feature wrapper for formatted 'asprintf' output.
+   Copyright (C) 2024 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
+   <https://www.gnu.org/licenses/>.  */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define printf_under_test(...)						\
+({									\
+  __label__ out;							\
+  int result;								\
+  char *str;								\
+									\
+  result = asprintf (&str, __VA_ARGS__);				\
+  if (result < 0)							\
+    {									\
+      perror ("asprintf");						\
+      goto out;								\
+    }									\
+  if (fwrite (str, sizeof (*str), result, stdout) != result)		\
+    {									\
+      perror ("fwrite");						\
+      result = -1;							\
+    }									\
+  free (str);								\
+out:									\
+  result;								\
+})
+
+#ifndef TIMEOUT
+# define TIMEOUT (DEFAULT_TIMEOUT * 24)
+#endif