[compiler-rt] [ASan] Ensure Symbolize Flag setting on Windows through __asan_default_options() is maintained throughout runtime (PR #132811)
Vitaly Buka via llvm-commits
llvm-commits at lists.llvm.org
Sat Aug 9 11:55:58 PDT 2025
https://github.com/vitalybuka updated https://github.com/llvm/llvm-project/pull/132811
>From 622216fd2e91ae72de1229d04a7c4146b940e784 Mon Sep 17 00:00:00 2001
From: MacGyver Codilla <mcodilla at microsoft.com>
Date: Wed, 19 Mar 2025 20:08:21 +0000
Subject: [PATCH 1/4] Implemented Update to Symbolizer Tools list after user
defined function becomes available on Windows.
---
compiler-rt/lib/asan/asan_flags.cpp | 3 +-
.../sanitizer_common/sanitizer_symbolizer.h | 3 ++
.../sanitizer_symbolizer_libcdep.cpp | 13 +++++++
.../test/asan/TestCases/Windows/symbolize.cpp | 38 +++++++++++++++++++
4 files changed, 56 insertions(+), 1 deletion(-)
create mode 100644 compiler-rt/test/asan/TestCases/Windows/symbolize.cpp
diff --git a/compiler-rt/lib/asan/asan_flags.cpp b/compiler-rt/lib/asan/asan_flags.cpp
index 9cfb70bd00c78..955560d77a683 100644
--- a/compiler-rt/lib/asan/asan_flags.cpp
+++ b/compiler-rt/lib/asan/asan_flags.cpp
@@ -247,7 +247,8 @@ void InitializeFlags() {
// See GH issue 'https://github.com/llvm/llvm-project/issues/117925' for
// details.
SetAllocatorMayReturnNull(common_flags()->allocator_may_return_null);
- });
+ Symbolizer::UpdateSymbolizerTools();
+ });
# if CAN_SANITIZE_UB
AddRegisterWeakFunctionCallback(
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h
index bd89dc4e302fc..604f143513193 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h
@@ -136,6 +136,9 @@ class Symbolizer final {
/// (if it wasn't already initialized).
static Symbolizer *GetOrInit();
static void LateInitialize();
+#if SANITIZER_WINDOWS
+ static void UpdateSymbolizerTools();
+#endif
// Returns a list of symbolized frames for a given address (containing
// all inlined functions, if necessary).
SymbolizedStack *SymbolizePC(uptr address);
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cpp
index 74458028ae8f5..320f92746df0c 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cpp
@@ -26,6 +26,19 @@ Symbolizer *Symbolizer::GetOrInit() {
return symbolizer_;
}
+#if SANITIZER_WINDOWS
+// If the 'symbolize' flag is set to 0, it clears the tools
+// associated with the symbolizer to prevent unnecessary symbolization and
+// resource usage. This is necessary because of the late binding of the
+// overridden method, __asan_default_options().
+void Symbolizer::UpdateSymbolizerTools() {
+ SpinMutexLock l(&init_mu_);
+ if (!common_flags()->symbolize) {
+ symbolizer_->tools_.clear();
+ }
+}
+#endif
+
// See sanitizer_symbolizer_markup.cpp.
#if !SANITIZER_SYMBOLIZER_MARKUP
diff --git a/compiler-rt/test/asan/TestCases/Windows/symbolize.cpp b/compiler-rt/test/asan/TestCases/Windows/symbolize.cpp
new file mode 100644
index 0000000000000..7f8cd5aea633b
--- /dev/null
+++ b/compiler-rt/test/asan/TestCases/Windows/symbolize.cpp
@@ -0,0 +1,38 @@
+// RUN: %clangxx_asan -O0 %s -o %t
+// RUN: %env_asan_opts=symbolize=0 not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-SYMBOLIZE-OFF
+// RUN: %env_asan_opts=symbolize=1 not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-SYMBOLIZE-ON
+
+// RUN: %clangxx_asan -O0 %s -o %t -DUSER_FUNCTION_OFF
+// RUN: not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-SYMBOLIZE-OFF
+// RUN: %env_asan_opts=symbolize=0 not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-SYMBOLIZE-OFF
+// RUN: %env_asan_opts=symbolize=1 not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-SYMBOLIZE-ON
+
+// RUN: %clangxx_asan -O0 %s -o %t -DUSER_FUNCTION_ON
+// RUN: not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-SYMBOLIZE-ON
+// RUN: %env_asan_opts=symbolize=0 not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-SYMBOLIZE-OFF
+// RUN: %env_asan_opts=symbolize=1 not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-SYMBOLIZE-ON
+#if USER_FUNCTION_OFF
+
+extern "C" __declspec(dllexport) extern const char *__asan_default_options() {
+ return "symbolize=0";
+}
+
+#endif
+
+#if USER_FUNCTION_ON
+
+extern "C" __declspec(dllexport) extern const char *__asan_default_options() {
+ return "symbolize=1";
+}
+
+#endif
+
+#include <cstdio>
+#include <cstdlib>
+
+volatile static int heapBufferOverflowValue = 10;
+int main() {
+ int *array = new int[10];
+ heapBufferOverflowValue = array[10]; // CHECK-SYMBOLIZE-ON: symbolize.cpp:36
+ return 0; // CHECK-SYMBOLIZE-OFF: symbolize.cpp.tmp+0x
+}
\ No newline at end of file
>From 43167b65bf0c5e3b74748fd2a989231fbd4c49a2 Mon Sep 17 00:00:00 2001
From: Vitaly Buka <vitalybuka at gmail.com>
Date: Sat, 9 Aug 2025 11:52:55 -0700
Subject: [PATCH 2/4] Update asan_flags.cpp
---
compiler-rt/lib/asan/asan_flags.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/compiler-rt/lib/asan/asan_flags.cpp b/compiler-rt/lib/asan/asan_flags.cpp
index 771fcd1f351c3..f222ec04a7728 100644
--- a/compiler-rt/lib/asan/asan_flags.cpp
+++ b/compiler-rt/lib/asan/asan_flags.cpp
@@ -241,7 +241,8 @@ void InitializeFlags() {
InitializeDefaultFlags();
ProcessFlags();
ApplyFlags();
- Symbolizer::UpdateSymbolizerTools();
+ if (!common_flags()->symbolize)
+ Symbolizer::ClearTools();
});
# if CAN_SANITIZE_UB
>From e6c76c35a10dd6b3134220b8b684c21a1153399b Mon Sep 17 00:00:00 2001
From: Vitaly Buka <vitalybuka at gmail.com>
Date: Sat, 9 Aug 2025 11:53:57 -0700
Subject: [PATCH 3/4] Update sanitizer_symbolizer.h
---
compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h
index 604f143513193..01051d3b110eb 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h
@@ -136,10 +136,9 @@ class Symbolizer final {
/// (if it wasn't already initialized).
static Symbolizer *GetOrInit();
static void LateInitialize();
-#if SANITIZER_WINDOWS
- static void UpdateSymbolizerTools();
-#endif
- // Returns a list of symbolized frames for a given address (containing
+ static void ClearTools();
+
+// Returns a list of symbolized frames for a given address (containing
// all inlined functions, if necessary).
SymbolizedStack *SymbolizePC(uptr address);
bool SymbolizeData(uptr address, DataInfo *info);
>From 7b7e931c63553b0b8bd1e3cba279611e7e22d8cf Mon Sep 17 00:00:00 2001
From: Vitaly Buka <vitalybuka at gmail.com>
Date: Sat, 9 Aug 2025 11:55:34 -0700
Subject: [PATCH 4/4] Update sanitizer_symbolizer_libcdep.cpp
---
.../lib/sanitizer_common/sanitizer_symbolizer_libcdep.cpp | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cpp
index 836dd6abc948f..c67c9dd615f1b 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cpp
@@ -26,18 +26,16 @@ Symbolizer *Symbolizer::GetOrInit() {
return symbolizer_;
}
-#if SANITIZER_WINDOWS
// If the 'symbolize' flag is set to 0, it clears the tools
// associated with the symbolizer to prevent unnecessary symbolization and
// resource usage. This is necessary because of the late binding of the
// overridden method, __asan_default_options().
-void Symbolizer::UpdateSymbolizerTools() {
+void Symbolizer::ClearTools() {
SpinMutexLock l(&init_mu_);
if (!common_flags()->symbolize) {
symbolizer_->tools_.clear();
}
}
-#endif
// See sanitizer_symbolizer_markup.cpp.
#if !SANITIZER_SYMBOLIZER_MARKUP
More information about the llvm-commits
mailing list