diff options
| -rw-r--r-- | compiler-rt/lib/asan/asan_suppressions.cc | 12 | ||||
| -rw-r--r-- | compiler-rt/lib/asan/asan_win.cc | 2 | ||||
| -rw-r--r-- | compiler-rt/test/asan/TestCases/Linux/asan_default_suppressions.cc | 14 |
3 files changed, 28 insertions, 0 deletions
diff --git a/compiler-rt/lib/asan/asan_suppressions.cc b/compiler-rt/lib/asan/asan_suppressions.cc index ea40554e453..3f76e20e4e7 100644 --- a/compiler-rt/lib/asan/asan_suppressions.cc +++ b/compiler-rt/lib/asan/asan_suppressions.cc @@ -31,11 +31,23 @@ static const char *kSuppressionTypes[] = { kInterceptorName, kInterceptorViaFunction, kInterceptorViaLibrary, kODRViolation}; +extern "C" { +#if SANITIZER_SUPPORTS_WEAK_HOOKS +SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE +const char *__asan_default_suppressions(); +#else +// No week hooks, provide empty implementation. +const char *__asan_default_suppressions() { return ""; } +#endif // SANITIZER_SUPPORTS_WEAK_HOOKS +} // extern "C" + void InitializeSuppressions() { CHECK_EQ(nullptr, suppression_ctx); suppression_ctx = new (suppression_placeholder) // NOLINT SuppressionContext(kSuppressionTypes, ARRAY_SIZE(kSuppressionTypes)); suppression_ctx->ParseFromFile(flags()->suppressions); + if (&__asan_default_suppressions) + suppression_ctx->Parse(__asan_default_suppressions()); } bool IsInterceptorSuppressed(const char *interceptor_name) { diff --git a/compiler-rt/lib/asan/asan_win.cc b/compiler-rt/lib/asan/asan_win.cc index 0ffedb2731a..5b1d0da3ac3 100644 --- a/compiler-rt/lib/asan/asan_win.cc +++ b/compiler-rt/lib/asan/asan_win.cc @@ -40,10 +40,12 @@ int __asan_should_detect_stack_use_after_return() { void __sanitizer_default_malloc_hook(void *ptr, uptr size) { } void __sanitizer_default_free_hook(void *ptr) { } const char* __asan_default_default_options() { return ""; } +const char* __asan_default_default_suppressions() { return ""; } void __asan_default_on_error() {} #pragma comment(linker, "/alternatename:___sanitizer_malloc_hook=___sanitizer_default_malloc_hook") // NOLINT #pragma comment(linker, "/alternatename:___sanitizer_free_hook=___sanitizer_default_free_hook") // NOLINT #pragma comment(linker, "/alternatename:___asan_default_options=___asan_default_default_options") // NOLINT +#pragma comment(linker, "/alternatename:___asan_default_suppressions=___asan_default_default_suppressions") // NOLINT #pragma comment(linker, "/alternatename:___asan_on_error=___asan_default_on_error") // NOLINT } // extern "C" diff --git a/compiler-rt/test/asan/TestCases/Linux/asan_default_suppressions.cc b/compiler-rt/test/asan/TestCases/Linux/asan_default_suppressions.cc new file mode 100644 index 00000000000..6e7c9cfbcb1 --- /dev/null +++ b/compiler-rt/test/asan/TestCases/Linux/asan_default_suppressions.cc @@ -0,0 +1,14 @@ +// Test that we use the suppressions from __asan_default_suppressions. +// RUN: %clangxx_asan %s -o %t && not %run %t 2>&1 | FileCheck %s +extern "C" { + const char *__asan_default_suppressions() { return "FooBar"; } +} +// CHECK: AddressSanitizer: failed to parse suppressions +int main() {} +// Test that we use the suppressions from __asan_default_suppressions. +// RUN: %clangxx_asan %s -o %t && not %run %t 2>&1 | FileCheck %s +extern "C" { + const char *__asan_default_suppressions() { return "FooBar"; } +} +// CHECK: AddressSanitizer: failed to parse suppressions +int main() {} |

