Module Name:    src
Committed By:   riastradh
Date:           Sat Nov  2 02:43:48 UTC 2024

Modified Files:
        src/common/lib/libc/string: explicit_memset.c
        src/distrib/sets/lists/comp: mi
        src/include: string.h
        src/lib/libc/string: Makefile.inc explicit_memset.3
        src/tests/lib/libc/string: t_memset.c

Log Message:
memset_explicit(3): Add C23 alias for explicit_memset.

PR standards/58607: C23: <string.h> memset_explicit


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/common/lib/libc/string/explicit_memset.c
cvs rdiff -u -r1.2479 -r1.2480 src/distrib/sets/lists/comp/mi
cvs rdiff -u -r1.56 -r1.57 src/include/string.h
cvs rdiff -u -r1.92 -r1.93 src/lib/libc/string/Makefile.inc
cvs rdiff -u -r1.2 -r1.3 src/lib/libc/string/explicit_memset.3
cvs rdiff -u -r1.4 -r1.5 src/tests/lib/libc/string/t_memset.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/common/lib/libc/string/explicit_memset.c
diff -u src/common/lib/libc/string/explicit_memset.c:1.4 src/common/lib/libc/string/explicit_memset.c:1.5
--- src/common/lib/libc/string/explicit_memset.c:1.4	Tue Jun 24 16:39:39 2014
+++ src/common/lib/libc/string/explicit_memset.c	Sat Nov  2 02:43:48 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: explicit_memset.c,v 1.4 2014/06/24 16:39:39 drochner Exp $ */
+/* $NetBSD: explicit_memset.c,v 1.5 2024/11/02 02:43:48 riastradh Exp $ */
 
 /*
  * Written by Matthias Drochner <droch...@netbsd.org>.
@@ -10,6 +10,7 @@
 #include <string.h>
 #ifdef __weak_alias
 __weak_alias(explicit_memset,_explicit_memset)
+__strong_alias(memset_explicit,_explicit_memset)	/* C23 */
 #endif
 #define explicit_memset_impl __explicit_memset_impl
 #else

Index: src/distrib/sets/lists/comp/mi
diff -u src/distrib/sets/lists/comp/mi:1.2479 src/distrib/sets/lists/comp/mi:1.2480
--- src/distrib/sets/lists/comp/mi:1.2479	Fri Nov  1 18:42:29 2024
+++ src/distrib/sets/lists/comp/mi	Sat Nov  2 02:43:48 2024
@@ -1,4 +1,4 @@
-#	$NetBSD: mi,v 1.2479 2024/11/01 18:42:29 riastradh Exp $
+#	$NetBSD: mi,v 1.2480 2024/11/02 02:43:48 riastradh Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 ./etc/mtree/set.comp				comp-sys-root
@@ -9256,6 +9256,7 @@
 ./usr/share/man/cat3/mempcpy.0			comp-c-catman		.cat
 ./usr/share/man/cat3/memrchr.0			comp-c-catman		.cat
 ./usr/share/man/cat3/memset.0			comp-c-catman		.cat
+./usr/share/man/cat3/memset_explicit.0		comp-c-catman		.cat
 ./usr/share/man/cat3/menu_attributes.0		comp-c-catman		.cat
 ./usr/share/man/cat3/menu_back.0		comp-c-catman		.cat
 ./usr/share/man/cat3/menu_cursor.0		comp-c-catman		.cat
@@ -17762,6 +17763,7 @@
 ./usr/share/man/html3/mempcpy.html		comp-c-htmlman		html
 ./usr/share/man/html3/memrchr.html		comp-c-htmlman		html
 ./usr/share/man/html3/memset.html		comp-c-htmlman		html
+./usr/share/man/html3/memset_explicit.html	comp-c-htmlman		html
 ./usr/share/man/html3/menu_attributes.html	comp-c-htmlman		html
 ./usr/share/man/html3/menu_back.html		comp-c-htmlman		html
 ./usr/share/man/html3/menu_cursor.html		comp-c-htmlman		html
@@ -26277,6 +26279,7 @@
 ./usr/share/man/man3/mempcpy.3			comp-c-man		.man
 ./usr/share/man/man3/memrchr.3			comp-c-man		.man
 ./usr/share/man/man3/memset.3			comp-c-man		.man
+./usr/share/man/man3/memset_explicit.3		comp-c-man		.man
 ./usr/share/man/man3/menu_attributes.3		comp-c-man		.man
 ./usr/share/man/man3/menu_back.3		comp-c-man		.man
 ./usr/share/man/man3/menu_cursor.3		comp-c-man		.man

Index: src/include/string.h
diff -u src/include/string.h:1.56 src/include/string.h:1.57
--- src/include/string.h:1.56	Fri Nov  1 21:11:37 2024
+++ src/include/string.h	Sat Nov  2 02:43:48 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: string.h,v 1.56 2024/11/01 21:11:37 riastradh Exp $	*/
+/*	$NetBSD: string.h,v 1.57 2024/11/02 02:43:48 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993
@@ -64,6 +64,10 @@ void	*memmem(const void *, size_t, const
 #endif /* _POSIX_C_SOURCE || _NETBSD_SOURCE */
 void	*memmove(void *, const void *, size_t);
 void	*memset(void *, int, size_t);
+#if (__STDC_VERSION__ - 0 >= 202311L) || defined(_ISOC23_SOURCE) || \
+    defined(_NETBSD_SOURCE)
+void	*memset_explicit(void *, int, size_t);
+#endif
 #if (_POSIX_C_SOURCE - 0 >= 200809L) || defined(_NETBSD_SOURCE)
 char	*stpcpy(char * __restrict, const char * __restrict);
 char	*stpncpy(char * __restrict, const char * __restrict, size_t);

Index: src/lib/libc/string/Makefile.inc
diff -u src/lib/libc/string/Makefile.inc:1.92 src/lib/libc/string/Makefile.inc:1.93
--- src/lib/libc/string/Makefile.inc:1.92	Fri Nov  1 18:42:30 2024
+++ src/lib/libc/string/Makefile.inc	Sat Nov  2 02:43:48 2024
@@ -1,5 +1,5 @@
 #	from: @(#)Makefile.inc	8.1 (Berkeley) 6/4/93
-#	$NetBSD: Makefile.inc,v 1.92 2024/11/01 18:42:30 riastradh Exp $
+#	$NetBSD: Makefile.inc,v 1.93 2024/11/02 02:43:48 riastradh Exp $
 
 # string sources
 .PATH: ${ARCHDIR}/string ${.CURDIR}/string
@@ -55,6 +55,7 @@ MAN+=	bm.3 bcmp.3 bcopy.3 bstring.3 bzer
 	swab.3 wcstok.3 wcswidth.3 wmemchr.3 wcsdup.3 wcscasecmp.3
 
 MLINKS+=bm.3 bm_comp.3 bm.3 bm_exec.3 bm.3 bm_free.3
+MLINKS+=explicit_memset.3 memset_explicit.3
 MLINKS+=ffs.3 ffsl.3
 MLINKS+=ffs.3 ffsll.3
 MLINKS+=popcount.3 popcountl.3

Index: src/lib/libc/string/explicit_memset.3
diff -u src/lib/libc/string/explicit_memset.3:1.2 src/lib/libc/string/explicit_memset.3:1.3
--- src/lib/libc/string/explicit_memset.3:1.2	Wed Aug 28 15:46:23 2013
+++ src/lib/libc/string/explicit_memset.3	Sat Nov  2 02:43:48 2024
@@ -1,4 +1,4 @@
-.\"	$NetBSD: explicit_memset.3,v 1.2 2013/08/28 15:46:23 riastradh Exp $
+.\"	$NetBSD: explicit_memset.3,v 1.3 2024/11/02 02:43:48 riastradh Exp $
 .\"
 .\" Copyright (c) 2013 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -27,11 +27,12 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd August 28, 2013
+.Dd November 1, 2024
 .Dt EXPLICIT_MEMSET 3
 .Os
 .Sh NAME
 .Nm explicit_memset
+.Nm memset_explicit
 .Nd guarantee writing a byte to a byte string
 .Sh LIBRARY
 .Lb libc
@@ -39,16 +40,20 @@
 .In string.h
 .Ft void *
 .Fn explicit_memset "void *b" "int c" "size_t len"
+.Ft void *
+.Fn memset_explicit "void *b" "int c" "size_t len"
 .Sh DESCRIPTION
 The
 .Fn explicit_memset
-function writes
+and
+.Fn memset_explicit
+functions write
 .Fa len
 bytes of value
 .Fa c
 (converted to an unsigned char) to the string
 .Fa b .
-It is guaranteed not to be optimized away by the compiler even if
+They are guaranteed not to be optimized away by the compiler even if
 .Fa b
 is no longer used and is about to be freed or go out of scope.
 .Sh RETURN VALUES
@@ -75,8 +80,17 @@ f(void)
 .Sh SEE ALSO
 .Xr consttime_memequal 3 ,
 .Xr memset 3
+.Sh STANDARDS
+The
+.Fn memset_explicit
+function conforms to
+.St -isoC-2023 .
 .Sh HISTORY
 The
 .Fn explicit_memset
 function appeared in
 .Nx 7.0 .
+The
+.Fn memset_explicit
+alias was added in
+.Nx 11.0 .

Index: src/tests/lib/libc/string/t_memset.c
diff -u src/tests/lib/libc/string/t_memset.c:1.4 src/tests/lib/libc/string/t_memset.c:1.5
--- src/tests/lib/libc/string/t_memset.c:1.4	Fri Sep 11 09:25:52 2015
+++ src/tests/lib/libc/string/t_memset.c	Sat Nov  2 02:43:48 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: t_memset.c,v 1.4 2015/09/11 09:25:52 martin Exp $ */
+/* $NetBSD: t_memset.c,v 1.5 2024/11/02 02:43:48 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: t_memset.c,v 1.4 2015/09/11 09:25:52 martin Exp $");
+__RCSID("$NetBSD: t_memset.c,v 1.5 2024/11/02 02:43:48 riastradh Exp $");
 
 #include <sys/stat.h>
 
@@ -44,6 +44,15 @@ static bool	check(char *, size_t, char);
 
 int zero;	/* always zero, but the compiler does not know */
 
+static const struct {
+	const char	*name;
+	void		*(*fn)(void *, int, size_t);
+} memsetfn[] = {
+	{ "memset", &memset },
+	{ "explicit_memset", &explicit_memset }, /* NetBSD extension */
+	{ "memset_explicit", &memset_explicit }, /* C23 adopted name */
+};
+
 ATF_TC(memset_array);
 ATF_TC_HEAD(memset_array, tc)
 {
@@ -53,16 +62,19 @@ ATF_TC_HEAD(memset_array, tc)
 ATF_TC_BODY(memset_array, tc)
 {
 	char buf[1024];
+	unsigned i;
 
-	(void)memset(buf, 0, sizeof(buf));
-
-	if (check(buf, sizeof(buf), 0) != true)
-		atf_tc_fail("memset(3) did not fill a static buffer");
-
-	(void)memset(buf, 'x', sizeof(buf));
-
-	if (check(buf, sizeof(buf), 'x') != true)
-		atf_tc_fail("memset(3) did not fill a static buffer");
+	for (i = 0; i < __arraycount(memsetfn); i++) {
+		(void)(*memsetfn[i].fn)(buf, 0, sizeof(buf));
+		ATF_CHECK_MSG(check(buf, sizeof(buf), 0),
+		    "%s did not fill a static buffer",
+		    memsetfn[i].name);
+
+		(void)(*memsetfn[i].fn)(buf, 'x', sizeof(buf));
+		ATF_CHECK_MSG(check(buf, sizeof(buf), 'x'),
+		    "%s did not fill a static buffer",
+		    memsetfn[i].name);
+	}
 }
 
 ATF_TC(memset_return);
@@ -75,8 +87,15 @@ ATF_TC_BODY(memset_return, tc)
 {
 	char *b = (char *)0x1;
 	char c[2];
-	ATF_REQUIRE_EQ(memset(b, 0, 0), b);
-	ATF_REQUIRE_EQ(memset(c, 2, sizeof(c)), c);
+	char *p;
+	unsigned i;
+
+	for (i = 0; i < __arraycount(memsetfn); i++) {
+		ATF_CHECK_EQ_MSG((p = (*memsetfn[i].fn)(b, 0, 0)), b,
+		    "%s: returned %p, expected %p", memsetfn[i].name, p, b);
+		ATF_CHECK_EQ_MSG((p = (*memsetfn[i].fn)(c, 2, sizeof(c))), c,
+		    "%s: returned %p, expected %p", memsetfn[i].name, p, c);
+	}
 }
 
 ATF_TC(memset_basic);
@@ -88,6 +107,7 @@ ATF_TC_HEAD(memset_basic, tc)
 ATF_TC_BODY(memset_basic, tc)
 {
 	char *buf, *ret;
+	unsigned i;
 
 	buf = malloc(page);
 	ret = malloc(page);
@@ -95,15 +115,19 @@ ATF_TC_BODY(memset_basic, tc)
 	ATF_REQUIRE(buf != NULL);
 	ATF_REQUIRE(ret != NULL);
 
-	fill(ret, page, 0);
-	memset(buf, 0, page);
+	for (i = 0; i < __arraycount(memsetfn); i++) {
+		fill(ret, page, 0);
+		(*memsetfn[i].fn)(buf, 0, page);
 
-	ATF_REQUIRE(memcmp(ret, buf, page) == 0);
+		ATF_CHECK_EQ_MSG(memcmp(ret, buf, page), 0, "%s",
+		    memsetfn[i].name);
 
-	fill(ret, page, 'x');
-	memset(buf, 'x', page);
+		fill(ret, page, 'x');
+		(*memsetfn[i].fn)(buf, 'x', page);
 
-	ATF_REQUIRE(memcmp(ret, buf, page) == 0);
+		ATF_CHECK_EQ_MSG(memcmp(ret, buf, page), 0, "%s",
+		    memsetfn[i].name);
+	}
 
 	free(buf);
 	free(ret);
@@ -119,17 +143,18 @@ ATF_TC_BODY(memset_nonzero, tc)
 {
 	const size_t n = 0x7f;
 	char *buf;
-	size_t i;
+	size_t i, j;
 
 	buf = malloc(page);
 	ATF_REQUIRE(buf != NULL);
 
 	for (i = 0x21; i < n; i++) {
-
-		(void)memset(buf, i, page);
-
-		if (check(buf, page, i) != true)
-			atf_tc_fail("memset(3) did not fill properly");
+		for (j = 0; j < __arraycount(memsetfn); j++) {
+			(void)(*memsetfn[j].fn)(buf, i, page);
+			ATF_CHECK_MSG(check(buf, page, i),
+			    "%s did not fill properly with %zu",
+			    memsetfn[j].name, i);
+		}
 	}
 
 	free(buf);
@@ -145,16 +170,19 @@ ATF_TC_HEAD(memset_zero_size, tc)
 ATF_TC_BODY(memset_zero_size, tc)
 {
 	char buf[1024];
+	unsigned i;
 
-	(void)memset(buf, 'x', sizeof(buf));
-
-	if (check(buf, sizeof(buf), 'x') != true)
-		atf_tc_fail("memset(3) did not fill a static buffer");
-
-	(void)memset(buf+sizeof(buf)/2, 0, zero);
-
-	if (check(buf, sizeof(buf), 'x') != true)
-		atf_tc_fail("memset(3) with 0 size did change the buffer");
+	for (i = 0; i < __arraycount(memsetfn); i++) {
+		(void)(*memsetfn[i].fn)(buf, 'x', sizeof(buf));
+		ATF_CHECK_MSG(check(buf, sizeof(buf), 'x'),
+		    "%s did not fill a static buffer",
+		    memsetfn[i].name);
+
+		(void)memset(buf+sizeof(buf)/2, 0, zero);
+		ATF_CHECK_MSG(check(buf, sizeof(buf), 'x'),
+		    "%s with 0 size did change the buffer",
+		    memsetfn[i].name);
+	}
 }
 
 ATF_TC(bzero_zero_size);
@@ -188,30 +216,33 @@ ATF_TC_HEAD(memset_struct, tc)
 ATF_TC_BODY(memset_struct, tc)
 {
 	struct stat st;
+	unsigned i;
 
-	st.st_dev = 0;
-	st.st_ino = 1;
-	st.st_mode = 2;
-	st.st_nlink = 3;
-	st.st_uid = 4;
-	st.st_gid = 5;
-	st.st_rdev = 6;
-	st.st_size = 7;
-	st.st_atime = 8;
-	st.st_mtime = 9;
-
-	(void)memset(&st, 0, sizeof(struct stat));
-
-	ATF_CHECK(st.st_dev == 0);
-	ATF_CHECK(st.st_ino == 0);
-	ATF_CHECK(st.st_mode == 0);
-	ATF_CHECK(st.st_nlink == 0);
-	ATF_CHECK(st.st_uid == 0);
-	ATF_CHECK(st.st_gid == 0);
-	ATF_CHECK(st.st_rdev == 0);
-	ATF_CHECK(st.st_size == 0);
-	ATF_CHECK(st.st_atime == 0);
-	ATF_CHECK(st.st_mtime == 0);
+	for (i = 0; i < __arraycount(memsetfn); i++) {
+		st.st_dev = 0;
+		st.st_ino = 1;
+		st.st_mode = 2;
+		st.st_nlink = 3;
+		st.st_uid = 4;
+		st.st_gid = 5;
+		st.st_rdev = 6;
+		st.st_size = 7;
+		st.st_atime = 8;
+		st.st_mtime = 9;
+
+		(void)(*memsetfn[i].fn)(&st, 0, sizeof(struct stat));
+
+		ATF_CHECK_MSG(st.st_dev == 0, "%s", memsetfn[i].name);
+		ATF_CHECK_MSG(st.st_ino == 0, "%s", memsetfn[i].name);
+		ATF_CHECK_MSG(st.st_mode == 0, "%s", memsetfn[i].name);
+		ATF_CHECK_MSG(st.st_nlink == 0, "%s", memsetfn[i].name);
+		ATF_CHECK_MSG(st.st_uid == 0, "%s", memsetfn[i].name);
+		ATF_CHECK_MSG(st.st_gid == 0, "%s", memsetfn[i].name);
+		ATF_CHECK_MSG(st.st_rdev == 0, "%s", memsetfn[i].name);
+		ATF_CHECK_MSG(st.st_size == 0, "%s", memsetfn[i].name);
+		ATF_CHECK_MSG(st.st_atime == 0, "%s", memsetfn[i].name);
+		ATF_CHECK_MSG(st.st_mtime == 0, "%s", memsetfn[i].name);
+	}
 }
 
 static void

Reply via email to