[PATCH] string: Declare Issue 8 functions for POSIX.1-2024 [BZ #34466]

DJ Delorie dj@redhat.com
Tue Aug 11 01:25:08 GMT 2026


LGTM
Reviewed-by: DJ Delorie <dj@redhat.com>

Matthias Goergens <matthias.goergens@gmail.com> 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.



More information about the Libc-alpha mailing list