From: Bastien Roucariès <ro...@debian.org> Use a volatile pointer to memset function to avoid dead end optimization
Signed-off-by: Bastien Roucariès <ro...@debian.org> --- lib/explicit_bzero.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/explicit_bzero.c b/lib/explicit_bzero.c index 21bbd67e8..59215852c 100644 --- a/lib/explicit_bzero.c +++ b/lib/explicit_bzero.c @@ -43,6 +43,10 @@ # undef explicit_bzero #endif +#if !defined __GNUC__ +static void * (* const volatile volatile_memset)(void *, int, size_t) = memset; +#endif + /* Set LEN bytes of S to 0. The compiler will not delete a call to this function, even if S is dead after the call. */ void @@ -54,17 +58,17 @@ explicit_bzero (void *s, size_t len) (void) memset_s(s,len,'\0',len); #elif HAVE_SECUREZEROMEMORY (void) SecureZeroMemory(s,len); -#else - memset (s, '\0', len); -#if defined __GNUC__ +#elif defined __GNUC__ + (void) memset (s, '\0', len); # if !defined __clang__ /* Compiler barrier. */ - asm volatile ("" ::: "memory"); + asm volatile ("" ::: "memory"); # else /* https://bugs.llvm.org/show_bug.cgi?id=15495#c11 */ __asm__ volatile("" : : "g"(s) : "memory"); # endif +#else + (void) volatile_memset(s,'\0',len); #endif - #endif } -- 2.25.1