xref: /aosp_15_r20/external/cronet/build/sanitizers/sanitizer_options.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker //
5*6777b538SAndroid Build Coastguard Worker // This file contains the default options for various compiler-based dynamic
6*6777b538SAndroid Build Coastguard Worker // tools.
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #if defined(ADDRESS_SANITIZER) || defined(LEAK_SANITIZER) ||  \
11*6777b538SAndroid Build Coastguard Worker     defined(MEMORY_SANITIZER) || defined(THREAD_SANITIZER) || \
12*6777b538SAndroid Build Coastguard Worker     defined(UNDEFINED_SANITIZER)
13*6777b538SAndroid Build Coastguard Worker // The callbacks we define here will be called from the sanitizer runtime, but
14*6777b538SAndroid Build Coastguard Worker // aren't referenced from the Chrome executable. We must ensure that those
15*6777b538SAndroid Build Coastguard Worker // callbacks are not sanitizer-instrumented, and that they aren't stripped by
16*6777b538SAndroid Build Coastguard Worker // the linker.
17*6777b538SAndroid Build Coastguard Worker #define SANITIZER_HOOK_ATTRIBUTE                                           \
18*6777b538SAndroid Build Coastguard Worker   extern "C"                                                               \
19*6777b538SAndroid Build Coastguard Worker   __attribute__((no_sanitize("address", "memory", "thread", "undefined"))) \
20*6777b538SAndroid Build Coastguard Worker   __attribute__((visibility("default")))                                   \
21*6777b538SAndroid Build Coastguard Worker   __attribute__((used))
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker // Functions returning default options are declared weak in the tools' runtime
24*6777b538SAndroid Build Coastguard Worker // libraries. To make the linker pick the strong replacements for those
25*6777b538SAndroid Build Coastguard Worker // functions from this module, we explicitly force its inclusion by passing
26*6777b538SAndroid Build Coastguard Worker // -Wl,-u_sanitizer_options_link_helper
27*6777b538SAndroid Build Coastguard Worker // SANITIZER_HOOK_ATTRIBUTE instead of just `extern "C"` solely to make the
28*6777b538SAndroid Build Coastguard Worker // symbol externally visible, for ToolsSanityTest.LinksSanitizerOptions.
_sanitizer_options_link_helper()29*6777b538SAndroid Build Coastguard Worker SANITIZER_HOOK_ATTRIBUTE void _sanitizer_options_link_helper() {}
30*6777b538SAndroid Build Coastguard Worker #endif
31*6777b538SAndroid Build Coastguard Worker 
32*6777b538SAndroid Build Coastguard Worker #if defined(ADDRESS_SANITIZER)
33*6777b538SAndroid Build Coastguard Worker // Default options for AddressSanitizer in various configurations:
34*6777b538SAndroid Build Coastguard Worker //   strip_path_prefix=/../../ - prefixes up to and including this
35*6777b538SAndroid Build Coastguard Worker //     substring will be stripped from source file paths in symbolized reports
36*6777b538SAndroid Build Coastguard Worker //   fast_unwind_on_fatal=1 - use the fast (frame-pointer-based) stack unwinder
37*6777b538SAndroid Build Coastguard Worker //     to print error reports. V8 doesn't generate debug info for the JIT code,
38*6777b538SAndroid Build Coastguard Worker //     so the slow unwinder may not work properly.
39*6777b538SAndroid Build Coastguard Worker //   detect_stack_use_after_return=1 - use fake stack to delay the reuse of
40*6777b538SAndroid Build Coastguard Worker //     stack allocations and detect stack-use-after-return errors.
41*6777b538SAndroid Build Coastguard Worker //   symbolize=1 - enable in-process symbolization.
42*6777b538SAndroid Build Coastguard Worker //   external_symbolizer_path=... - provides the path to llvm-symbolizer
43*6777b538SAndroid Build Coastguard Worker //     relative to the main executable
44*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) | BUILDFLAG(IS_APPLE)
45*6777b538SAndroid Build Coastguard Worker const char kAsanDefaultOptions[] =
46*6777b538SAndroid Build Coastguard Worker     "strip_path_prefix=/../../ fast_unwind_on_fatal=1 "
47*6777b538SAndroid Build Coastguard Worker     "detect_stack_use_after_return=1 symbolize=1 detect_leaks=0 "
48*6777b538SAndroid Build Coastguard Worker     "external_symbolizer_path=%d/../../third_party/llvm-build/Release+Asserts/"
49*6777b538SAndroid Build Coastguard Worker     "bin/llvm-symbolizer";
50*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_WIN)
51*6777b538SAndroid Build Coastguard Worker const char* kAsanDefaultOptions =
52*6777b538SAndroid Build Coastguard Worker     "strip_path_prefix=\\..\\..\\ fast_unwind_on_fatal=1 "
53*6777b538SAndroid Build Coastguard Worker     "detect_stack_use_after_return=1 symbolize=1 "
54*6777b538SAndroid Build Coastguard Worker     "external_symbolizer_path=%d/../../third_party/"
55*6777b538SAndroid Build Coastguard Worker     "llvm-build/Release+Asserts/bin/llvm-symbolizer.exe";
56*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_APPLE)
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_APPLE) || \
59*6777b538SAndroid Build Coastguard Worker     BUILDFLAG(IS_WIN)
60*6777b538SAndroid Build Coastguard Worker // Allow NaCl to override the default asan options.
61*6777b538SAndroid Build Coastguard Worker extern const char* kAsanDefaultOptionsNaCl;
62*6777b538SAndroid Build Coastguard Worker __attribute__((weak)) const char* kAsanDefaultOptionsNaCl = nullptr;
63*6777b538SAndroid Build Coastguard Worker 
__asan_default_options()64*6777b538SAndroid Build Coastguard Worker SANITIZER_HOOK_ATTRIBUTE const char *__asan_default_options() {
65*6777b538SAndroid Build Coastguard Worker   if (kAsanDefaultOptionsNaCl)
66*6777b538SAndroid Build Coastguard Worker     return kAsanDefaultOptionsNaCl;
67*6777b538SAndroid Build Coastguard Worker   return kAsanDefaultOptions;
68*6777b538SAndroid Build Coastguard Worker }
69*6777b538SAndroid Build Coastguard Worker 
70*6777b538SAndroid Build Coastguard Worker extern char kASanDefaultSuppressions[];
71*6777b538SAndroid Build Coastguard Worker 
__asan_default_suppressions()72*6777b538SAndroid Build Coastguard Worker SANITIZER_HOOK_ATTRIBUTE const char *__asan_default_suppressions() {
73*6777b538SAndroid Build Coastguard Worker   return kASanDefaultSuppressions;
74*6777b538SAndroid Build Coastguard Worker }
75*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_APPLE)
76*6777b538SAndroid Build Coastguard Worker         // || BUILDFLAG(IS_WIN)
77*6777b538SAndroid Build Coastguard Worker #endif  // ADDRESS_SANITIZER
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker #if defined(THREAD_SANITIZER) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS))
80*6777b538SAndroid Build Coastguard Worker // Default options for ThreadSanitizer in various configurations:
81*6777b538SAndroid Build Coastguard Worker //   second_deadlock_stack=1 - more verbose deadlock reports.
82*6777b538SAndroid Build Coastguard Worker //   report_signal_unsafe=0 - do not report async-signal-unsafe functions
83*6777b538SAndroid Build Coastguard Worker //     called from signal handlers.
84*6777b538SAndroid Build Coastguard Worker //   report_thread_leaks=0 - do not report unjoined threads at the end of
85*6777b538SAndroid Build Coastguard Worker //     the program execution.
86*6777b538SAndroid Build Coastguard Worker //   print_suppressions=1 - print the list of matched suppressions.
87*6777b538SAndroid Build Coastguard Worker //   history_size=7 - make the history buffer proportional to 2^7 (the maximum
88*6777b538SAndroid Build Coastguard Worker //     value) to keep more stack traces.
89*6777b538SAndroid Build Coastguard Worker //   strip_path_prefix=/../../ - prefixes up to and including this
90*6777b538SAndroid Build Coastguard Worker //     substring will be stripped from source file paths in symbolized reports.
91*6777b538SAndroid Build Coastguard Worker //   external_symbolizer_path=... - provides the path to llvm-symbolizer
92*6777b538SAndroid Build Coastguard Worker //     relative to the main executable
93*6777b538SAndroid Build Coastguard Worker const char kTsanDefaultOptions[] =
94*6777b538SAndroid Build Coastguard Worker     "second_deadlock_stack=1 report_signal_unsafe=0 "
95*6777b538SAndroid Build Coastguard Worker     "report_thread_leaks=0 print_suppressions=1 history_size=7 "
96*6777b538SAndroid Build Coastguard Worker     "strip_path_prefix=/../../ external_symbolizer_path=%d/../../third_party/"
97*6777b538SAndroid Build Coastguard Worker     "llvm-build/Release+Asserts/bin/llvm-symbolizer";
98*6777b538SAndroid Build Coastguard Worker 
__tsan_default_options()99*6777b538SAndroid Build Coastguard Worker SANITIZER_HOOK_ATTRIBUTE const char *__tsan_default_options() {
100*6777b538SAndroid Build Coastguard Worker   return kTsanDefaultOptions;
101*6777b538SAndroid Build Coastguard Worker }
102*6777b538SAndroid Build Coastguard Worker 
103*6777b538SAndroid Build Coastguard Worker extern char kTSanDefaultSuppressions[];
104*6777b538SAndroid Build Coastguard Worker 
__tsan_default_suppressions()105*6777b538SAndroid Build Coastguard Worker SANITIZER_HOOK_ATTRIBUTE const char *__tsan_default_suppressions() {
106*6777b538SAndroid Build Coastguard Worker   return kTSanDefaultSuppressions;
107*6777b538SAndroid Build Coastguard Worker }
108*6777b538SAndroid Build Coastguard Worker 
109*6777b538SAndroid Build Coastguard Worker #endif  // defined(THREAD_SANITIZER) && (BUILDFLAG(IS_LINUX) ||
110*6777b538SAndroid Build Coastguard Worker         // BUILDFLAG(IS_CHROMEOS))
111*6777b538SAndroid Build Coastguard Worker 
112*6777b538SAndroid Build Coastguard Worker #if defined(MEMORY_SANITIZER)
113*6777b538SAndroid Build Coastguard Worker // Default options for MemorySanitizer:
114*6777b538SAndroid Build Coastguard Worker //   strip_path_prefix=/../../ - prefixes up to and including this
115*6777b538SAndroid Build Coastguard Worker //     substring will be stripped from source file paths in symbolized reports.
116*6777b538SAndroid Build Coastguard Worker //   external_symbolizer_path=... - provides the path to llvm-symbolizer
117*6777b538SAndroid Build Coastguard Worker //     relative to the main executable
118*6777b538SAndroid Build Coastguard Worker const char kMsanDefaultOptions[] =
119*6777b538SAndroid Build Coastguard Worker     "strip_path_prefix=/../../ "
120*6777b538SAndroid Build Coastguard Worker     "external_symbolizer_path=%d/../../third_party/llvm-build/Release+Asserts/"
121*6777b538SAndroid Build Coastguard Worker     "bin/llvm-symbolizer";
122*6777b538SAndroid Build Coastguard Worker 
__msan_default_options()123*6777b538SAndroid Build Coastguard Worker SANITIZER_HOOK_ATTRIBUTE const char *__msan_default_options() {
124*6777b538SAndroid Build Coastguard Worker   return kMsanDefaultOptions;
125*6777b538SAndroid Build Coastguard Worker }
126*6777b538SAndroid Build Coastguard Worker 
127*6777b538SAndroid Build Coastguard Worker #endif  // MEMORY_SANITIZER
128*6777b538SAndroid Build Coastguard Worker 
129*6777b538SAndroid Build Coastguard Worker #if defined(LEAK_SANITIZER)
130*6777b538SAndroid Build Coastguard Worker // Default options for LeakSanitizer:
131*6777b538SAndroid Build Coastguard Worker //   strip_path_prefix=/../../ - prefixes up to and including this
132*6777b538SAndroid Build Coastguard Worker //     substring will be stripped from source file paths in symbolized reports.
133*6777b538SAndroid Build Coastguard Worker //   external_symbolizer_path=... - provides the path to llvm-symbolizer
134*6777b538SAndroid Build Coastguard Worker //     relative to the main executable
135*6777b538SAndroid Build Coastguard Worker //   use_poisoned=1 - Scan poisoned memory. This is useful for Oilpan (C++
136*6777b538SAndroid Build Coastguard Worker //     garbage collection) which wants to exclude its managed memory from being
137*6777b538SAndroid Build Coastguard Worker //     reported as leaks (through root regions) and also temporarily poisons
138*6777b538SAndroid Build Coastguard Worker //     memory regions before calling destructors of objects to avoid destructors
139*6777b538SAndroid Build Coastguard Worker //     cross-referencing memory in other objects. Main thread termination in
140*6777b538SAndroid Build Coastguard Worker //     Blink is not graceful and leak checks may be emitted at any time, which
141*6777b538SAndroid Build Coastguard Worker //     means that the garbage collector may be in a state with poisoned memory,
142*6777b538SAndroid Build Coastguard Worker //     leading to false-positive reports.
143*6777b538SAndroid Build Coastguard Worker const char kLsanDefaultOptions[] =
144*6777b538SAndroid Build Coastguard Worker     "strip_path_prefix=/../../ use_poisoned=1 "
145*6777b538SAndroid Build Coastguard Worker 
146*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_FUCHSIA)
147*6777b538SAndroid Build Coastguard Worker     "external_symbolizer_path=%d/../../third_party/llvm-build/Release+Asserts/"
148*6777b538SAndroid Build Coastguard Worker     "bin/llvm-symbolizer "
149*6777b538SAndroid Build Coastguard Worker #endif
150*6777b538SAndroid Build Coastguard Worker 
151*6777b538SAndroid Build Coastguard Worker #if defined(ARCH_CPU_64_BITS)
152*6777b538SAndroid Build Coastguard Worker     // When pointer compression in V8 is enabled the external pointers in the
153*6777b538SAndroid Build Coastguard Worker     // heap are guaranteed to be only 4 bytes aligned. So we need this option
154*6777b538SAndroid Build Coastguard Worker     // in order to ensure that LSAN will find all the external pointers.
155*6777b538SAndroid Build Coastguard Worker     // TODO(crbug.com/328552): see updates from 2019.
156*6777b538SAndroid Build Coastguard Worker     "use_unaligned=1 "
157*6777b538SAndroid Build Coastguard Worker #endif  // ARCH_CPU_64_BITS
158*6777b538SAndroid Build Coastguard Worker     ;
159*6777b538SAndroid Build Coastguard Worker 
__lsan_default_options()160*6777b538SAndroid Build Coastguard Worker SANITIZER_HOOK_ATTRIBUTE const char *__lsan_default_options() {
161*6777b538SAndroid Build Coastguard Worker   return kLsanDefaultOptions;
162*6777b538SAndroid Build Coastguard Worker }
163*6777b538SAndroid Build Coastguard Worker 
164*6777b538SAndroid Build Coastguard Worker // TODO(https://fxbug.dev/102967): Remove when Fuchsia supports
165*6777b538SAndroid Build Coastguard Worker // module-name-based and function-name-based suppression.
166*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_FUCHSIA)
167*6777b538SAndroid Build Coastguard Worker 
168*6777b538SAndroid Build Coastguard Worker extern char kLSanDefaultSuppressions[];
169*6777b538SAndroid Build Coastguard Worker 
__lsan_default_suppressions()170*6777b538SAndroid Build Coastguard Worker SANITIZER_HOOK_ATTRIBUTE const char *__lsan_default_suppressions() {
171*6777b538SAndroid Build Coastguard Worker   return kLSanDefaultSuppressions;
172*6777b538SAndroid Build Coastguard Worker }
173*6777b538SAndroid Build Coastguard Worker 
174*6777b538SAndroid Build Coastguard Worker #endif  // !BUILDFLAG(IS_FUCHSIA)
175*6777b538SAndroid Build Coastguard Worker #endif  // LEAK_SANITIZER
176*6777b538SAndroid Build Coastguard Worker 
177*6777b538SAndroid Build Coastguard Worker #if defined(UNDEFINED_SANITIZER)
178*6777b538SAndroid Build Coastguard Worker // Default options for UndefinedBehaviorSanitizer:
179*6777b538SAndroid Build Coastguard Worker //   print_stacktrace=1 - print the stacktrace when UBSan reports an error.
180*6777b538SAndroid Build Coastguard Worker const char kUbsanDefaultOptions[] =
181*6777b538SAndroid Build Coastguard Worker     "print_stacktrace=1 strip_path_prefix=/../../ "
182*6777b538SAndroid Build Coastguard Worker     "external_symbolizer_path=%d/../../third_party/llvm-build/Release+Asserts/"
183*6777b538SAndroid Build Coastguard Worker     "bin/llvm-symbolizer";
184*6777b538SAndroid Build Coastguard Worker 
__ubsan_default_options()185*6777b538SAndroid Build Coastguard Worker SANITIZER_HOOK_ATTRIBUTE const char* __ubsan_default_options() {
186*6777b538SAndroid Build Coastguard Worker   return kUbsanDefaultOptions;
187*6777b538SAndroid Build Coastguard Worker }
188*6777b538SAndroid Build Coastguard Worker 
189*6777b538SAndroid Build Coastguard Worker #endif  // UNDEFINED_SANITIZER
190