[v3.1,02/12] stdio-common: Add tests for formatted asprintf 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
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
* 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
* 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
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
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
===================================================================
@@ -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
===================================================================
@@ -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"
===================================================================
@@ -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"
===================================================================
@@ -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"
===================================================================
@@ -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"
===================================================================
@@ -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"
===================================================================
@@ -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"
===================================================================
@@ -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"
===================================================================
@@ -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"
===================================================================
@@ -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"
===================================================================
@@ -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"
===================================================================
@@ -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"
===================================================================
@@ -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"
===================================================================
@@ -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"
===================================================================
@@ -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"
===================================================================
@@ -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