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