[compiler-rt] [compiler-rt][sanitizer-common] adding C23 memset_explicit interception. (PR #154428)
David CARLIER via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 5 18:09:28 PDT 2025
https://github.com/devnexen updated https://github.com/llvm/llvm-project/pull/154428
>From 8b27cc7e2215033bd5a86f24c90bb9b4d898a4d0 Mon Sep 17 00:00:00 2001
From: David Carlier <devnexen at gmail.com>
Date: Tue, 19 Aug 2025 22:49:43 +0100
Subject: [PATCH] [compiler-rt][sanitizer-common] adding C23 memset_explicit
interception.
---
.../sanitizer_common_interceptors_memintrinsics.inc | 11 +++++++++++
.../sanitizer_platform_interceptors.h | 4 +++-
.../TestCases/Linux/memset_explicit.c | 13 +++++++++++++
3 files changed, 27 insertions(+), 1 deletion(-)
create mode 100644 compiler-rt/test/sanitizer_common/TestCases/Linux/memset_explicit.c
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 <stddef.h>
+#include <stdlib.h>
+
+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;
+}
More information about the llvm-commits
mailing list