1 //===-- asan_suppressions.cc ----------------------------------------------===//
3 // This file is distributed under the University of Illinois Open Source
4 // License. See LICENSE.TXT for details.
6 //===----------------------------------------------------------------------===//
8 // This file is a part of AddressSanitizer, an address sanity checker.
10 // Issue suppression and suppression-related functions.
11 //===----------------------------------------------------------------------===//
13 #include "asan_suppressions.h"
15 #include "asan_stack.h"
16 #include "sanitizer_common/sanitizer_placement_new.h"
17 #include "sanitizer_common/sanitizer_suppressions.h"
18 #include "sanitizer_common/sanitizer_symbolizer.h"
22 ALIGNED(64) static char suppression_placeholder
[sizeof(SuppressionContext
)];
23 static SuppressionContext
*suppression_ctx
= nullptr;
24 static const char kInterceptorName
[] = "interceptor_name";
25 static const char kInterceptorViaFunction
[] = "interceptor_via_fun";
26 static const char kInterceptorViaLibrary
[] = "interceptor_via_lib";
27 static const char kODRViolation
[] = "odr_violation";
28 static const char *kSuppressionTypes
[] = {
29 kInterceptorName
, kInterceptorViaFunction
, kInterceptorViaLibrary
,
33 #if SANITIZER_SUPPORTS_WEAK_HOOKS
34 SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
35 const char *__asan_default_suppressions();
37 // No week hooks, provide empty implementation.
38 const char *__asan_default_suppressions() { return ""; }
39 #endif // SANITIZER_SUPPORTS_WEAK_HOOKS
42 void InitializeSuppressions() {
43 CHECK_EQ(nullptr, suppression_ctx
);
44 suppression_ctx
= new (suppression_placeholder
) // NOLINT
45 SuppressionContext(kSuppressionTypes
, ARRAY_SIZE(kSuppressionTypes
));
46 suppression_ctx
->ParseFromFile(flags()->suppressions
);
47 if (&__asan_default_suppressions
)
48 suppression_ctx
->Parse(__asan_default_suppressions());
51 bool IsInterceptorSuppressed(const char *interceptor_name
) {
52 CHECK(suppression_ctx
);
54 // Match "interceptor_name" suppressions.
55 return suppression_ctx
->Match(interceptor_name
, kInterceptorName
, &s
);
58 bool HaveStackTraceBasedSuppressions() {
59 CHECK(suppression_ctx
);
60 return suppression_ctx
->HasSuppressionType(kInterceptorViaFunction
) ||
61 suppression_ctx
->HasSuppressionType(kInterceptorViaLibrary
);
64 bool IsODRViolationSuppressed(const char *global_var_name
) {
65 CHECK(suppression_ctx
);
67 // Match "odr_violation" suppressions.
68 return suppression_ctx
->Match(global_var_name
, kODRViolation
, &s
);
71 bool IsStackTraceSuppressed(const StackTrace
*stack
) {
72 if (!HaveStackTraceBasedSuppressions())
75 CHECK(suppression_ctx
);
76 Symbolizer
*symbolizer
= Symbolizer::GetOrInit();
78 for (uptr i
= 0; i
< stack
->size
&& stack
->trace
[i
]; i
++) {
79 uptr addr
= stack
->trace
[i
];
81 if (suppression_ctx
->HasSuppressionType(kInterceptorViaLibrary
)) {
82 // Match "interceptor_via_lib" suppressions.
83 if (const char *module_name
= symbolizer
->GetModuleNameForPc(addr
))
84 if (suppression_ctx
->Match(module_name
, kInterceptorViaLibrary
, &s
))
88 if (suppression_ctx
->HasSuppressionType(kInterceptorViaFunction
)) {
89 SymbolizedStack
*frames
= symbolizer
->SymbolizePC(addr
);
91 for (SymbolizedStack
*cur
= frames
; cur
; cur
= cur
->next
) {
92 const char *function_name
= cur
->info
.function
;
96 // Match "interceptor_via_fun" suppressions.
97 if (suppression_ctx
->Match(function_name
, kInterceptorViaFunction
,
109 } // namespace __asan