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 <[email protected]>.
@@ -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