Re: [PATCH] string: Declare POSIX.1-2024 string functions [BZ #34466]
Adhemerval Zanella Netto <[email protected]>
| Newsgroups | gmane.comp.lib.glibc.alpha |
|---|---|
| Organization | Linaro |
| Message-ID | <[email protected]> |
On 13/08/26 00:13, Gao Xiang wrote: > From: Xiang Gao <[email protected]> > > POSIX.1-2024 adds memmem, strlcpy and strlcat to string.h. > glibc already implements these functions. but their public > declarations are currently only exports by __USE_MISC. > Applications built in POSIX.1-2024 mode with _POSIX_C_SOURCE= > 202405L will fail with implicit function declaration errors. > > Using existed feature macro to expose the declarations required > by POSIX.1-2024. > > Add string/tst-posix2024 to verify strict POSIX.1-2024 header > visibility. > > Tested on x86_64 Fedora 42. > > The following tests passed without regressions: > make test t=string/tst-posix2024 > make check subdirs=string > make check subdirs=conform > > Signed-off-by: Xiang Gao <[email protected]> We already have a similar patch [1], already approved by DJ. Does this add or fix something else? [1] https://patchwork.sourceware.org/project/glibc/patch/[email protected]/ > --- > conform/data/string.h-data | 7 ++++++ > string/Makefile | 2 ++ > string/string.h | 6 ++++-- > string/tst-posix2024.c | 44 ++++++++++++++++++++++++++++++++++++++ > 4 files changed, 57 insertions(+), 2 deletions(-) > create mode 100644 string/tst-posix2024.c > > diff --git a/conform/data/string.h-data b/conform/data/string.h-data > index abc6b12b5d..c9526e06d0 100644 > --- a/conform/data/string.h-data > +++ b/conform/data/string.h-data > @@ -13,6 +13,9 @@ function int memcmp (const void*, const void*, size_t) > function {void*} memcpy (void*, const void*, size_t) > function {void*} memmove (void*, const void*, size_t) > function {void*} memset (void*, int, size_t) > +#if defined XOPEN2K24 || defined POSIX2024 > +function {void*} memmem (const void*, size_t, const void*, size_t) > +#endif > #if defined XOPEN2K8 || defined XOPEN2K24 || defined POSIX2008 || defined POSIX2024 > function {char*} stpcpy (char*, const char*) > function {char*} stpncpy (char*, const char*, size_t) > @@ -38,6 +41,10 @@ function int strerror_r (int, char*, size_t) > function {char*} strerror_l (int, locale_t) > #endif > function size_t strlen (const char*) > +#if defined XOPEN2K24 || defined POSIX2024 > +function size_t strlcat (char*, const char*, size_t) > +function size_t strlcpy (char*, const char*, size_t) > +#endif > function {char*} strncat (char*, const char*, size_t) > function int strncmp (const char*, const char*, size_t) > function {char*} strncpy (char*, const char*, size_t) > diff --git a/string/Makefile b/string/Makefile > index aa0b0c2f57..a968994fcb 100644 > --- a/string/Makefile > +++ b/string/Makefile > @@ -201,6 +201,7 @@ tests := \ > tst-endian \ > tst-inlcall \ > tst-memmove-overflow \ > + tst-posix2024 \ > tst-strerror-fail \ > tst-strfry \ > tst-strlcat \ > @@ -270,6 +271,7 @@ CFLAGS-tst-inlcall.c += -fno-builtin > CFLAGS-tst-xbzero-opt.c += -O3 > CFLAGS-tst-xmemset-opt.c += -O3 > CFLAGS-test-endian-sign-conversion.c += -Werror -Wsign-conversion > +CFLAGS-tst-posix2024.c += -std=c17 -Werror=implicit-function-declaration > # BZ 21006: Resolve all functions but at least explicit_bzero at startup. > # Otherwise the test fails on s390x as the memcpy in prepare_test_buffer is > # done by loading r4 / r5 with the test_pattern and using store multiple > diff --git a/string/string.h b/string/string.h > index 743395b3e3..15959356a2 100644 > --- a/string/string.h > +++ b/string/string.h > @@ -414,7 +414,7 @@ extern char *strcasestr (const char *__haystack, const char *__needle) > # endif > #endif > > -#ifdef __USE_MISC > +#if defined __USE_MISC || defined __USE_XOPEN2K24 > /* Find the first occurrence of NEEDLE in HAYSTACK. > NEEDLE is NEEDLELEN bytes long; > HAYSTACK is HAYSTACKLEN bytes long. */ > @@ -423,7 +423,9 @@ extern void *memmem (const void *__haystack, size_t __haystacklen, > __THROW __attribute_pure__ __nonnull ((1, 3)) > __attr_access ((__read_only__, 1, 2)) > __attr_access ((__read_only__, 3, 4)); > +#endif > > +#ifdef __USE_MISC > /* Copy N bytes of SRC to DEST, return pointer to bytes after the > last written byte. */ > extern void *__mempcpy (void *__restrict __dest, > @@ -533,7 +535,7 @@ extern char *stpncpy (char *__restrict __dest, > __THROW __nonnull ((1, 2)); > #endif > > -#ifdef __USE_MISC > +#if defined __USE_MISC || defined __USE_XOPEN2K24 > /* Copy at most N - 1 characters from SRC to DEST. */ > extern size_t strlcpy (char *__restrict __dest, > const char *__restrict __src, size_t __n) > diff --git a/string/tst-posix2024.c b/string/tst-posix2024.c > new file mode 100644 > index 0000000000..0e25d0770f > --- /dev/null > +++ b/string/tst-posix2024.c > @@ -0,0 +1,44 @@ > +/* Test POSIX.1-2024 <string.h> declarations. > + Copyright (C) 2026 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/>. */ > + > +/* Undo _GNU_SOURCE define before the first public header is included so that > + this test checks strict POSIX.1-2024 visibility. */ > + > +#undef _GNU_SOURCE > +#define _POSIX_C_SOURCE 202405L > + > +#include <string.h> > +#include <support/check.h> > + > +static int > +do_test (void) > +{ > + char buffer[8]; > + > + TEST_COMPARE (strlcpy (buffer, "abc", sizeof buffer), 3); > + TEST_COMPARE_STRING (buffer, "abc"); > + > + TEST_COMPARE (strlcat (buffer, "defgh", sizeof buffer), 8); > + TEST_COMPARE_STRING (buffer, "abcdefg"); > + > + TEST_VERIFY (memmem (buffer, strlen (buffer), "cde", 3) == buffer + 2); > + > + return 0; > +} > + > +#include <support/test-driver.c>