xref: /netbsd-src/common/lib/libc/string/explicit_memset.c (revision b7152c324c52acdae196766ae19dab96f1d64ea1)
1*b7152c32Sriastradh /* $NetBSD: explicit_memset.c,v 1.5 2024/11/02 02:43:48 riastradh Exp $ */
21970d452Sdrochner 
31970d452Sdrochner /*
41970d452Sdrochner  * Written by Matthias Drochner <drochner@NetBSD.org>.
51970d452Sdrochner  * Public domain.
61970d452Sdrochner  */
782db4b98Sriastradh 
882db4b98Sriastradh #if !defined(_KERNEL) && !defined(_STANDALONE)
91239c2bbSriastradh #include "namespace.h"
1082db4b98Sriastradh #include <string.h>
111239c2bbSriastradh #ifdef __weak_alias
121239c2bbSriastradh __weak_alias(explicit_memset,_explicit_memset)
13*b7152c32Sriastradh __strong_alias(memset_explicit,_explicit_memset)	/* C23 */
141239c2bbSriastradh #endif
1582db4b98Sriastradh #define explicit_memset_impl __explicit_memset_impl
1682db4b98Sriastradh #else
1782db4b98Sriastradh #include <lib/libkern/libkern.h>
1882db4b98Sriastradh #endif
1982db4b98Sriastradh 
2082db4b98Sriastradh /*
2182db4b98Sriastradh  * The use of a volatile pointer guarantees that the compiler
2282db4b98Sriastradh  * will not optimise the call away.
2382db4b98Sriastradh  */
2482db4b98Sriastradh void *(* volatile explicit_memset_impl)(void *, int, size_t) = memset;
2582db4b98Sriastradh 
26495fdb7eSriastradh void *
2782db4b98Sriastradh explicit_memset(void *b, int c, size_t len)
2882db4b98Sriastradh {
2982db4b98Sriastradh 
30495fdb7eSriastradh 	return (*explicit_memset_impl)(b, c, len);
3182db4b98Sriastradh }
32