crt: Implement memset_explicit

I implemented it in the same way as glibc. It's just memset, followed by a
compiler barrier

Signed-off-by: LIU Hao <lh_mouse@126.com>
diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index 3da0d1a..946e280 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -1278,7 +1278,7 @@
   misc/gettimeofday.c    misc/__mingw_has_sse.c      \
   misc/ftime32.c         misc/ftime64.c              \
   misc/memalignment.c \
-  misc/mempcpy.c         misc/mingw-aligned-malloc.c \
+  misc/mempcpy.c         misc/memset_explicit.c      misc/mingw-aligned-malloc.c \
   misc/strndup.c \
   misc/mingw_matherr.c   misc/mingw_mbwc_convert.c  misc/mingw_usleep.c     misc/mingw_wcstod.c          misc/mingw_wcstof.c    \
   misc/mingw_wcstold.c \
diff --git a/mingw-w64-crt/misc/memset_explicit.c b/mingw-w64-crt/misc/memset_explicit.c
new file mode 100644
index 0000000..015f377
--- /dev/null
+++ b/mingw-w64-crt/misc/memset_explicit.c
@@ -0,0 +1,16 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#define __CRT__NO_INLINE
+#include <string.h>
+
+void * __cdecl
+memset_explicit (void *d, int c, size_t len)
+{
+  memset(d, c, len);
+  __asm__ __volatile__("" ::: "memory");
+  return d;
+}
diff --git a/mingw-w64-headers/crt/memory.h b/mingw-w64-headers/crt/memory.h
index 760d84b..289f060 100644
--- a/mingw-w64-headers/crt/memory.h
+++ b/mingw-w64-headers/crt/memory.h
@@ -41,6 +41,9 @@
   _SECIMP errno_t __cdecl memcpy_s (void *_dest,size_t _numberOfElements,const void *_src,size_t _count);
   void * __cdecl mempcpy (void *_Dst, const void *_Src, size_t _Size);
   void * __cdecl memset(void *_Dst,int _Val,size_t _Size);
+#if !defined(__STRICT_ANSI__) || __STDC_VERSION__ + 0 >= 202311L
+  void * __cdecl memset_explicit(void *_Dst,int _Val,size_t _Size);
+#endif
 
 #ifndef	NO_OLDNAMES
   void * __cdecl memccpy(void *_Dst,const void *_Src,int _Val,size_t _Size) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
diff --git a/mingw-w64-headers/crt/string.h b/mingw-w64-headers/crt/string.h
index 36daadc..34bb336 100644
--- a/mingw-w64-headers/crt/string.h
+++ b/mingw-w64-headers/crt/string.h
@@ -54,6 +54,9 @@
   _SECIMP errno_t __cdecl memcpy_s (void *_dest,size_t _numberOfElements,const void *_src,size_t _count);
   void * __cdecl mempcpy (void *_Dst, const void *_Src, size_t _Size);
   void * __cdecl memset(void *_Dst,int _Val,size_t _Size);
+#if !defined(__STRICT_ANSI__) || __STDC_VERSION__ + 0 >= 202311L
+  void * __cdecl memset_explicit(void *_Dst,int _Val,size_t _Size);
+#endif
 #ifndef	NO_OLDNAMES
   void * __cdecl memccpy(void *_Dst,const void *_Src,int _Val,size_t _Size) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
   int __cdecl memicmp(const void *_Buf1,const void *_Buf2,size_t _Size) __MINGW_ATTRIB_DEPRECATED_MSVC2005;