Document Number: N2485 
        Submitter: Aaron Peter
          Bachmann 
        Submission Date: 2020-02-19 
      Add explicit_memset() as non-optional
        part of <string.h> to C2X
      
explicit_memset() or
        something equivalent is useful to  securely set or erase
        memory. In Annex K there is memset_s() but Annex K
        is optional. Since most C-libraries chose not to implement Annex
        K the option is less useful than desirable.
memset_s() and it is currently part of
          Annex K.explicit_memset()explicit_bzero() memzero_explicit(), SecureZeroMemory()
explicit_memset() shall behave like memset(),
        with the added stipulation that the call to explicit_memset()
        is guaranteed not to be optimized away.
      
...memset...() over ...zero...() since
      it allows to set an arbitrary value not just (unsigned
        char)0. 
      
      The name explicit_memset() is used more often
        than , so stick with
        that. memset_explicit()
_explicit' as suffix already
      i. e. - atomic_..._explicit() - introducing void
        *memset_explicit(void *s, int c, size_t len) instead of void
        *explicit_memset(void *s, int c, size_t len) seems a
      reasonable alternative. In order to make explicit_memset() even
        more useful, a compiler may choose to erase local (partial)
        copies of *s as well.
        That is an issue of the quality of the implementation.
        
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1969.htm states: "Therefore, we propose that Annex K be either removed from the next revision of the C standard, or deprecated and then removed."
 
      
After
      
      7.24.6.1 The memset function
      
      ...
      
      add
      
       7.24.6.2 The explicit_memset function
        
        Synopsis
        
        #include <string.h>
         void *explicit_memset(void *s, int c, size_t n);
         
        Description
        
       The explicit_memset function copies the value of c
        (converted to an unsigned char) into each of the first n
        characters of the object pointed to by s. Unlike memset, any
        call to the explicit_memset function shall be evaluated strictly
        according to the rules of the abstract machine as described in
        (5.1.2.3). That is, any call to the explicit_memset function
        shall assume that the memory indicated by s and n may be
        accessible in the future and thus contains the values indicated
        by c.
       
 
        Returns
        
        The explicit_memset function returns the value of s.