Re: [PATCH] string: Declare Issue 8 functions for POSIX.1-2024 [BZ #34466]
DJ Delorie <[email protected]>
| Newsgroups | gmane.comp.lib.glibc.alpha |
|---|---|
| Message-ID | <[email protected]> |
LGTM Reviewed-by: DJ Delorie <[email protected]> Matthias Goergens <[email protected]> writes: > POSIX.1-2024 requires memmem, strlcpy, and strlcat in <string.h>, and > wcslcpy and wcslcat in <wchar.h>. Confirmed. > Expose these declarations and their fortified wrappers under > __USE_XOPEN2K24 as well as __USE_MISC. Keep mempcpy restricted to > __USE_MISC. Sounds reasonable. > diff --git a/string/Makefile b/string/Makefile > tst-memmove-overflow \ > tst-strerror-fail \ > tst-strfry \ > + tst-string-posix2024 \ > + tst-string-posix2024-fortify \ > + tst-string-xopen2024 \ > tst-strlcat \ Ok. > +CPPFLAGS-tst-string-posix2024-fortify.c += \ > + $(no-fortify-source) -D_FORTIFY_SOURCE=2 This looks wierd, I think it needs a comment. I assume you're using $(no-fortify-source) to undefind _FORTIFY_SOURCE to avoid a redefinition warning? I see it's a common idiom elsewhere, so I won't complain. Ok. > diff --git a/string/bits/string_fortified.h b/string/bits/string_fortified.h > index f1f597ec..ae97bb55 100644 > --- a/string/bits/string_fortified.h > +++ b/string/bits/string_fortified.h > @@ -162,7 +162,7 @@ __NTH (strncat (__fortify_clang_overload_arg (char *, __restrict, __dest), > __glibc_objsize (__dest)); > } > > -#ifdef __USE_MISC > +#if defined __USE_MISC || defined __USE_XOPEN2K24 > extern size_t __strlcpy_chk (char *__dest, const char *__src, size_t __n, > size_t __destlen) __THROW; > extern size_t __REDIRECT_NTH (__strlcpy_alias, > @@ -197,6 +197,6 @@ __NTH (strlcat (__fortify_clang_overload_arg (char *, __restrict, __dest), > return __strlcat_chk (__dest, __src, __n, __glibc_objsize (__dest)); > return __strlcat_alias (__dest, __src, __n); > } > -#endif /* __USE_MISC */ > +#endif /* __USE_MISC || __USE_XOPEN2K24 */ Ok. > diff --git a/string/string.h b/string/string.h > -#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. */ Ok. > 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) Ok. > diff --git a/string/tst-string-posix2024-fortify.c b/string/tst-string-posix2024-fortify.c > +/* Process tst-string-posix2024-main.c in fortified POSIX.1-2024 mode. */ > +#undef _GNU_SOURCE > +#define _POSIX_C_SOURCE 202405L > +#define TEST_FORTIFY 1 > + > +#include "tst-string-posix2024-main.c" Ok. > diff --git a/string/tst-string-posix2024-main.c b/string/tst-string-posix2024-main.c > new file mode 100644 > index 00000000..4a52b09c > --- /dev/null > +++ b/string/tst-string-posix2024-main.c > @@ -0,0 +1,45 @@ > +/* Check POSIX.1-2024 declarations in <string.h>. > + 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/>. */ > + > +#include <string.h> > + > +static int > +do_test (void) > +{ > + void *(*memmem_function) (const void *, size_t, const void *, size_t) > + = memmem; > + size_t (*strlcpy_function) (char *, const char *, size_t) = strlcpy; > + size_t (*strlcat_function) (char *, const char *, size_t) = strlcat; > + > +#ifdef TEST_FORTIFY > + size_t (*strlcpy_chk_function) (char *, const char *, size_t, size_t) > + = __strlcpy_chk; > + size_t (*strlcat_chk_function) (char *, const char *, size_t, size_t) > + = __strlcat_chk; > +#endif > + > + int result = memmem_function == NULL > + || strlcpy_function == NULL > + || strlcat_function == NULL; > +#ifdef TEST_FORTIFY > + result |= strlcpy_chk_function == NULL || strlcat_chk_function == NULL; > +#endif > + return result; > +} > + > +#include <support/test-driver.c> Ok. > diff --git a/string/tst-string-posix2024.c b/string/tst-string-posix2024.c > @@ -0,0 +1,5 @@ > +/* Process tst-string-posix2024-main.c in POSIX.1-2024 mode. */ > +#undef _GNU_SOURCE > +#define _POSIX_C_SOURCE 202405L > + > +#include "tst-string-posix2024-main.c" Ok. > diff --git a/string/tst-string-xopen2024.c b/string/tst-string-xopen2024.c > new file mode 100644 > index 00000000..8f1deaa9 > --- /dev/null > +++ b/string/tst-string-xopen2024.c > @@ -0,0 +1,5 @@ > +/* Process tst-string-posix2024-main.c in X/Open Issue 8 mode. */ > +#undef _GNU_SOURCE > +#define _XOPEN_SOURCE 800 > + > +#include "tst-string-posix2024-main.c" Ok. > diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile > tst-mbsrtowcs \ > tst-mbstowcs \ > tst-wchar-h \ > + tst-wchar-posix2024 \ > + tst-wchar-posix2024-fortify \ > + tst-wchar-xopen2024 \ Ok. > tst-wcrtomb \ > tst-wcslcat \ > @@ -270,6 +273,8 @@ CFLAGS-wcstold_l.c += $(strtox-CFLAGS) > CFLAGS-wcstof128_l.c += $(strtox-CFLAGS) > CFLAGS-wcstof_l.c += $(strtox-CFLAGS) > CPPFLAGS-tst-wchar-h.c += $(no-fortify-source) -D_FORTIFY_SOURCE=2 > +CPPFLAGS-tst-wchar-posix2024-fortify.c += \ > + $(no-fortify-source) -D_FORTIFY_SOURCE=2 Ok. > diff --git a/wcsmbs/bits/wchar2-decl.h b/wcsmbs/bits/wchar2-decl.h > -#ifdef __USE_MISC > +#if defined __USE_MISC || defined __USE_XOPEN2K24 > extern size_t __wcslcpy_chk (wchar_t *__dest, const wchar_t *__src, size_t __n, > size_t __destlen) __THROW; > extern size_t __REDIRECT_NTH (__wcslcpy_alias, > @@ -291,6 +291,6 @@ extern size_t __wcslcat_chk (wchar_t *__dest, const wchar_t *__src, size_t __n, > extern size_t __REDIRECT_NTH (__wcslcat_alias, > (wchar_t *__dest, const wchar_t *__src, > size_t __n), wcslcat); > -#endif /* __USE_MISC */ > +#endif /* __USE_MISC || __USE_XOPEN2K24 */ > > #endif /* bits/wchar2-decl.h. */ Ok. > diff --git a/wcsmbs/bits/wchar2.h b/wcsmbs/bits/wchar2.h > index 2966c0ec..bd99d520 100644 > --- a/wcsmbs/bits/wchar2.h > +++ b/wcsmbs/bits/wchar2.h > @@ -134,7 +134,7 @@ __NTH (wcsncat (__fortify_clang_overload_arg (wchar_t *, __restrict, __dest), > return __wcsncat_alias (__dest, __src, __n); > } > > -#ifdef __USE_MISC > +#if defined __USE_MISC || defined __USE_XOPEN2K24 > __fortify_function __attribute_overloadable__ size_t > __NTH (wcslcpy (__fortify_clang_overload_arg (wchar_t *, __restrict, __dest), > const wchar_t *__restrict __src, size_t __n)) > @@ -163,7 +163,7 @@ __NTH (wcslcat (__fortify_clang_overload_arg (wchar_t *, __restrict, __dest), > __glibc_objsize (__dest) / sizeof (wchar_t)); > return __wcslcat_alias (__dest, __src, __n); > } > -#endif /* __USE_MISC */ > +#endif /* __USE_MISC || __USE_XOPEN2K24 */ Ok. > diff --git a/wcsmbs/tst-wchar-posix2024-fortify.c b/wcsmbs/tst-wchar-posix2024-fortify.c > new file mode 100644 > index 00000000..ff30525a > --- /dev/null > +++ b/wcsmbs/tst-wchar-posix2024-fortify.c > @@ -0,0 +1,6 @@ > +/* Process tst-wchar-posix2024-main.c in fortified POSIX.1-2024 mode. */ > +#undef _GNU_SOURCE > +#define _POSIX_C_SOURCE 202405L > +#define TEST_FORTIFY 1 > + > +#include "tst-wchar-posix2024-main.c" Ok. > diff --git a/wcsmbs/tst-wchar-posix2024-main.c b/wcsmbs/tst-wchar-posix2024-main.c > new file mode 100644 > index 00000000..d744e548 > --- /dev/null > +++ b/wcsmbs/tst-wchar-posix2024-main.c > @@ -0,0 +1,41 @@ > +/* Check POSIX.1-2024 declarations in <wchar.h>. > + 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/>. */ > + > +#include <wchar.h> > + > +static int > +do_test (void) > +{ > + size_t (*wcslcpy_function) (wchar_t *, const wchar_t *, size_t) = wcslcpy; > + size_t (*wcslcat_function) (wchar_t *, const wchar_t *, size_t) = wcslcat; > + > +#ifdef TEST_FORTIFY > + size_t (*wcslcpy_chk_function) (wchar_t *, const wchar_t *, size_t, size_t) > + = __wcslcpy_chk; > + size_t (*wcslcat_chk_function) (wchar_t *, const wchar_t *, size_t, size_t) > + = __wcslcat_chk; > +#endif > + > + int result = wcslcpy_function == NULL || wcslcat_function == NULL; > +#ifdef TEST_FORTIFY > + result |= wcslcpy_chk_function == NULL || wcslcat_chk_function == NULL; > +#endif > + return result; > +} > + > +#include <support/test-driver.c> Ok. > diff --git a/wcsmbs/tst-wchar-posix2024.c b/wcsmbs/tst-wchar-posix2024.c > new file mode 100644 > index 00000000..09f62fca > --- /dev/null > +++ b/wcsmbs/tst-wchar-posix2024.c > @@ -0,0 +1,5 @@ > +/* Process tst-wchar-posix2024-main.c in POSIX.1-2024 mode. */ > +#undef _GNU_SOURCE > +#define _POSIX_C_SOURCE 202405L > + > +#include "tst-wchar-posix2024-main.c" Ok. > diff --git a/wcsmbs/tst-wchar-xopen2024.c b/wcsmbs/tst-wchar-xopen2024.c > new file mode 100644 > index 00000000..5ac3172b > --- /dev/null > +++ b/wcsmbs/tst-wchar-xopen2024.c > @@ -0,0 +1,5 @@ > +/* Process tst-wchar-posix2024-main.c in X/Open Issue 8 mode. */ > +#undef _GNU_SOURCE > +#define _XOPEN_SOURCE 800 > + > +#include "tst-wchar-posix2024-main.c" Ok. > diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h > index 449f3b4e..ec169ee6 100644 > --- a/wcsmbs/wchar.h > +++ b/wcsmbs/wchar.h > @@ -108,7 +108,7 @@ extern wchar_t *wcsncpy (wchar_t *__restrict __dest, > const wchar_t *__restrict __src, size_t __n) > __THROW __nonnull ((1, 2)); > > -#ifdef __USE_MISC > +#if defined __USE_MISC || defined __USE_XOPEN2K24 > /* Copy at most N - 1 characters from SRC to DEST. */ > extern size_t wcslcpy (wchar_t *__restrict __dest, > const wchar_t *__restrict __src, size_t __n) Ok.