Document Number: N2485
Submitter: Aaron Peter
Bachmann
Submission Date: 2020-02-19
Add explicit_memset() as non-optional
part of <str
ing.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.