diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_memintrinsics.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_memintrinsics.inc index 0b6731c89950b..5334b0ded17e8 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_memintrinsics.inc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_memintrinsics.inc @@ -233,6 +233,16 @@ INTERCEPTOR(void *, bzero, void *block, usize size) { #define INIT_BZERO #endif // SANITIZER_INTERCEPT_BZERO +#if SANITIZER_INTERCEPT_MEMSET_EXPLICIT +INTERCEPTOR(void *, memset_explicit, void *block, int c, usize size) { + void *ctx; + COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, c, size); +} +#define INIT_MEMSET_EXPLICIT COMMON_INTERCEPT_FUNCTION(memset_explicit) +#else +#define INIT_MEMSET_EXPLICIT +#endif + namespace __sanitizer { // This does not need to be called if InitializeCommonInterceptors() is called. void InitializeMemintrinsicInterceptors() { @@ -242,5 +252,6 @@ void InitializeMemintrinsicInterceptors() { INIT_AEABI_MEM; INIT___BZERO; INIT_BZERO; + INIT_MEMSET_EXPLICIT; } } // namespace __sanitizer diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h index 29987decdff45..eee7af2069694 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -663,15 +663,17 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment, #define SANITIZER_INTERCEPT_GETSERVBYNAME_R SI_GLIBC #define SANITIZER_INTERCEPT_GETSERVBYPORT_R SI_GLIBC -// Until free_sized and free_aligned_sized are more generally available, +// Until free_sized, free_aligned_sized and memset_explicit are more generally available, // we can only unconditionally intercept on ELF-based platforms where it // is okay to have undefined weak symbols. #ifdef __ELF__ # define SANITIZER_INTERCEPT_FREE_SIZED 1 # define SANITIZER_INTERCEPT_FREE_ALIGNED_SIZED 1 +# define SANITIZER_INTERCEPT_MEMSET_EXPLICIT 1 #else # define SANITIZER_INTERCEPT_FREE_SIZED 0 # define SANITIZER_INTERCEPT_FREE_ALIGNED_SIZED 0 +# define SANITIZER_INTERCEPT_MEMSET_EXPLICIT 0 #endif // This macro gives a way for downstream users to override the above diff --git a/compiler-rt/test/sanitizer_common/TestCases/Linux/memset_explicit.c b/compiler-rt/test/sanitizer_common/TestCases/Linux/memset_explicit.c new file mode 100644 index 0000000000000..4714ea51f25de --- /dev/null +++ b/compiler-rt/test/sanitizer_common/TestCases/Linux/memset_explicit.c @@ -0,0 +1,13 @@ +// RUN: %clang -std=c23 -O0 %s -o %t && %run %t +// UNSUPPORTED: asan, lsan, hwasan, ubsan + +#include +#include + +extern void *memset_explicit(void *p, int value, size_t size); + +int main() { + char secbuffer[64]; + (void)memset_explicit(secbuffer, 0, sizeof(secbuffer)); + return 0; +}