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

Matthias Goergens <[email protected]> Wed, 5 Aug 2026 16:02:13 +0800
Newsgroups gmane.comp.lib.glibc.alpha
Message-ID <[email protected]>
POSIX.1-2024 requires memmem, strlcpy, and strlcat in <string.h>, and
wcslcpy and wcslcat in <wchar.h>. Expose these declarations and their
fortified wrappers under __USE_XOPEN2K24 as well as __USE_MISC. Keep
mempcpy restricted to __USE_MISC.

Add declaration tests for POSIX and X/Open Issue 8 modes, including
fortified headers.

Signed-off-by: Matthias Goergens <[email protected]>
---

I do not have an FSF copyright assignment on file. This patch is offered
under the Developer Certificate of Origin 1.1, as certified by the
Signed-off-by line above.

 string/Makefile                       |  6 ++++
 string/bits/string_fortified.h        |  4 +--
 string/string.h                       |  6 ++--
 string/tst-string-posix2024-fortify.c |  6 ++++
 string/tst-string-posix2024-main.c    | 45 +++++++++++++++++++++++++++
 string/tst-string-posix2024.c         |  5 +++
 string/tst-string-xopen2024.c         |  5 +++
 wcsmbs/Makefile                       |  5 +++
 wcsmbs/bits/wchar2-decl.h             |  4 +--
 wcsmbs/bits/wchar2.h                  |  4 +--
 wcsmbs/tst-wchar-posix2024-fortify.c  |  6 ++++
 wcsmbs/tst-wchar-posix2024-main.c     | 41 ++++++++++++++++++++++++
 wcsmbs/tst-wchar-posix2024.c          |  5 +++
 wcsmbs/tst-wchar-xopen2024.c          |  5 +++
 wcsmbs/wchar.h                        |  2 +-
 15 files changed, 140 insertions(+), 9 deletions(-)
 create mode 100644 string/tst-string-posix2024-fortify.c
 create mode 100644 string/tst-string-posix2024-main.c
 create mode 100644 string/tst-string-posix2024.c
 create mode 100644 string/tst-string-xopen2024.c
 create mode 100644 wcsmbs/tst-wchar-posix2024-fortify.c
 create mode 100644 wcsmbs/tst-wchar-posix2024-main.c
 create mode 100644 wcsmbs/tst-wchar-posix2024.c
 create mode 100644 wcsmbs/tst-wchar-xopen2024.c

diff --git a/string/Makefile b/string/Makefile
index aa0b0c2f..503d32e0 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -203,6 +203,9 @@ tests := \
   tst-memmove-overflow \
   tst-strerror-fail \
   tst-strfry \
+  tst-string-posix2024 \
+  tst-string-posix2024-fortify \
+  tst-string-xopen2024 \
   tst-strlcat \
   tst-strlcat2 \
   tst-strlcpy \
@@ -218,6 +221,9 @@ tests := \
   tst-xmemset-opt \
 # tests
 
+CPPFLAGS-tst-string-posix2024-fortify.c += \
+  $(no-fortify-source) -D_FORTIFY_SOURCE=2
+
 tests-static-internal := \
   test-memswap \
 # tests-static-internal
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 */
 
 #endif /* bits/string_fortified.h */
diff --git a/string/string.h b/string/string.h
index 743395b3..15959356 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-string-posix2024-fortify.c b/string/tst-string-posix2024-fortify.c
new file mode 100644
index 00000000..67f2967d
--- /dev/null
+++ b/string/tst-string-posix2024-fortify.c
@@ -0,0 +1,6 @@
+/* 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"
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>
diff --git a/string/tst-string-posix2024.c b/string/tst-string-posix2024.c
new file mode 100644
index 00000000..a903dd12
--- /dev/null
+++ 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"
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"
diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile
index f4f89c03..e0628912 100644
--- a/wcsmbs/Makefile
+++ b/wcsmbs/Makefile
@@ -179,6 +179,9 @@ tests := \
   tst-mbsrtowcs \
   tst-mbstowcs \
   tst-wchar-h \
+  tst-wchar-posix2024 \
+  tst-wchar-posix2024-fortify \
+  tst-wchar-xopen2024 \
   tst-wcpncpy \
   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
 
 CFLAGS-isoc99_wscanf.c += -fexceptions
 CFLAGS-isoc99_fwscanf.c += -fexceptions
diff --git a/wcsmbs/bits/wchar2-decl.h b/wcsmbs/bits/wchar2-decl.h
index 0f61877b..75e2c066 100644
--- a/wcsmbs/bits/wchar2-decl.h
+++ b/wcsmbs/bits/wchar2-decl.h
@@ -279,7 +279,7 @@ extern size_t __REDIRECT_NTH (__wcsnrtombs_chk_warn,
 
 #endif
 
-#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.  */
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 */
 
 #ifdef __va_arg_pack
 __fortify_function int
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"
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>
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"
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"
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)
-- 
2.55.0