Re: [PATCH] string: Declare POSIX.1-2024 string functions [BZ #34466]
Alex Gao <[email protected]>
| Newsgroups | gmane.comp.lib.glibc.alpha |
|---|---|
| Message-ID | <[email protected]> |
在 2026/8/13 19:46, Adhemerval Zanella Netto 写道: > > > 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> > Thanks for pointing this out. No, my patch does not fix anything beyound Matthias' s patch. I misssed that earlier patch thread when I started looking at BZ#34466. Plase disregard my patch, Matthias' s version is more complete because it also covers the fortify path.