summaryrefslogtreecommitdiffstats
path: root/mozglue/build/AsanOptions.cpp
blob: a96e6bd840f2bda19aa08b96194e6fe75ea91bc9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "mozilla/Attributes.h"

#ifndef _MSC_VER  // Not supported by clang-cl yet

// When running with AddressSanitizer, we need to explicitly set some
// options specific to our codebase to prevent errors during runtime.
// To override these, set the ASAN_OPTIONS environment variable.
//
// Currently, these are:
//
//   allow_user_segv_handler=1 - Tell ASan to allow our code to use its
//   own SIGSEGV handlers. This is required by ASM.js internally.
//
//   alloc_dealloc_mismatch=0 - Disable alloc-dealloc mismatch checking
//   in ASan. This is required because we define our own new/delete
//   operators that are backed by malloc/free. If one of them gets inlined
//   while the other doesn't, ASan will report false positives.
//
//   detect_leaks=0 - Disable LeakSanitizer. This is required because
//   otherwise leak checking will be enabled for various building and
//   testing executables where we don't care much about leaks.
//
//   allocator_may_return_null=1 - Tell ASan to return NULL when an allocation
//   fails instead of aborting the program. This allows us to handle failing
//   allocations the same way we would handle them with a regular allocator and
//   also uncovers potential bugs that might occur in these situations.
//
//   max_malloc_fill_size - Tell ASan to initialize memory to a certain value
//   when it is allocated. This option specifies the maximum allocation size
//   for which ASan should still initialize the memory. The value we specify
//   here is exactly 256MiB.
//
//   max_free_fill_size - Similar to max_malloc_fill_size, tell ASan to
//   overwrite memory with a certain value when it is freed. Again, the value
//   here specifies the maximum allocation size, larger allocations will
//   skipped.
//
//   malloc_fill_byte / free_fill_byte - These values specify the byte values
//   used to initialize/overwrite memory in conjunction with the previous
//   options max_malloc_fill_size and max_free_fill_size. The values used here
//   are 0xe4 and 0xe5 to match the kAllocPoison and kAllocJunk constants used
//   by mozjemalloc.
//
//   malloc_context_size - This value specifies how many stack frames are
//   stored for each malloc and free call. Since Firefox can have lots of deep
//   stacks with allocations, we limit the default size here further to save
//   some memory.
//
//   fast_unwind_on_check - Use the fast (frame-pointer-based) stack unwinder
//   for internal CHECK failures. The slow unwinder doesn't work on Android.
//
//   fast_unwind_on_fatal - Use the fast (frame-pointer-based) stack unwinder
//   to print fatal error reports. The slow unwinder doesn't work on Android.
//
//   detect_stack_use_after_return=0 - Work around bug 1768099.
//
//   intercept_tls_get_addr=0 - Work around
//   https://github.com/google/sanitizers/issues/1322 (bug 1635327).
//
// !! Note: __asan_default_options is not used on Android! (bug 1576213)
// These should be updated in:
//   mobile/android/geckoview/src/asan/resources/lib/*/wrap.sh
//
extern "C" MOZ_ASAN_IGNORE const char* __asan_default_options() {
  return "allow_user_segv_handler=1:alloc_dealloc_mismatch=0:detect_leaks=0"
#  ifdef MOZ_ASAN_REPORTER
         ":malloc_context_size=20"
#  endif
#  ifdef __ANDROID__
         ":fast_unwind_on_check=1:fast_unwind_on_fatal=1"
#  endif
         ":max_free_fill_size=268435456:max_malloc_fill_size=268435456"
         ":malloc_fill_byte=228:free_fill_byte=229"
         ":handle_sigill=1"
         ":allocator_may_return_null=1"
         ":detect_stack_use_after_return=0"
         ":intercept_tls_get_addr=0";
}

// !!! Please do not add suppressions for new leaks in Gecko code, unless they
// are intentional !!!
extern "C" const char* __lsan_default_suppressions() {
  return "# Add your suppressions below\n"

         // LSan runs with a shallow stack depth and no debug symbols, so some
         // small intentional leaks in system libraries show up with this.  You
         // do not want this enabled when running locally with a deep stack, as
         // it can catch too much.
         "leak:libc.so\n"

         // nsComponentManagerImpl intentionally leaks factory entries, and
         // probably some other stuff.
         "leak:nsComponentManagerImpl\n"

         // Bug 981220 - Pixman fails to free TLS memory.
         "leak:pixman_implementation_lookup_composite\n"

         // Bug 987918 - Font shutdown leaks when CLEANUP_MEMORY is not enabled.
         "leak:libfontconfig.so\n"
         "leak:libfreetype.so\n"
         "leak:GI___strdup\n"
         // The symbol is really __GI___strdup, but if you have the leading _,
         // it doesn't suppress it.

         // xdg_mime_init() is leaked by Gtk3 library
         "leak:xdg_mime_init\n"

         // Bug 1078015 - If the process terminates during a PR_Sleep, LSAN
         // detects a leak
         "leak:PR_Sleep\n"

         // Bug 1363976 - Stylo holds some global data alive forever.
         "leak:style::global_style_data\n"
         "leak:style::sharing::SHARING_CACHE_KEY\n"
         "leak:style::bloom::BLOOM_KEY\n"

         //
         // Many leaks only affect some test suites.  The suite annotations are
         // not checked.
         //

         // Bug 979928 - WebRTC leaks in different mochitest suites.
         "leak:NR_reg_init\n"
         // nr_reg_local_init should be redundant with NR_reg_init, but on
         // Aurora we get fewer stack frames for some reason.
         "leak:nr_reg_local_init\n"
         "leak:r_log_register\n"
         "leak:nr_reg_set\n"

         // This is a one-time leak in mochitest-bc, so it is probably okay to
         // ignore.
         "leak:GlobalPrinters::InitializeGlobalPrinters\n"
         "leak:nsPSPrinterList::GetPrinterList\n"

         // Bug 1028456 - Various NSPR fd-related leaks in different mochitest
         // suites.
         "leak:_PR_Getfd\n"

         // Bug 1028483 - The XML parser sometimes leaks an object. Mostly
         // happens in toolkit/components/thumbnails.
         "leak:processInternalEntity\n"

         // Bug 1187421 - NSS does not always free the error stack in different
         // mochitest suites.
         "leak:nss_ClearErrorStack\n"

         // Bug 1602689 - leak at mozilla::NotNull, RacyRegisteredThread,
         // RegisteredThread::RegisteredThread, mozilla::detail::UniqueSelector
         "leak:RegisteredThread::RegisteredThread\n"

         //
         // Leaks with system libraries in their stacks. These show up across a
         // number of tests. Better symbols and disabling fast stackwalking may
         // help diagnose these.
         //
         "leak:libcairo.so\n"
         // https://github.com/OpenPrinting/cups/pull/317
         "leak:libcups.so\n"
         "leak:libdl.so\n"
         "leak:libdricore.so\n"
         "leak:libdricore9.2.1.so\n"
         "leak:libGL.so\n"
         "leak:libEGL_mesa.so\n"
         "leak:libglib-2.0.so\n"
         "leak:libglsl.so\n"
         "leak:libp11-kit.so\n"
         "leak:libpixman-1.so\n"
         "leak:libpulse.so\n"
         // lubpulsecommon 1.1 is Ubuntu 12.04
         "leak:libpulsecommon-1.1.so\n"
         // lubpulsecommon 1.1 is Ubuntu 16.04
         "leak:libpulsecommon-8.0.so\n"
         "leak:libresolv.so\n"
         "leak:libstdc++.so\n"
         "leak:libXrandr.so\n"
         "leak:libX11.so\n"
         "leak:pthread_setspecific_internal\n"
         "leak:swrast_dri.so\n"

         "leak:js::frontend::BytecodeEmitter:\n"
         "leak:js::frontend::GeneralParser\n"
         "leak:js::frontend::Parse\n"
         "leak:xpc::CIGSHelper\n"
         "leak:mozJSModuleLoader\n"
         "leak:mozilla::xpcom::ConstructJSMComponent\n"
         "leak:XPCWrappedNativeJSOps\n"

      // End of suppressions.
      ;  // Please keep this semicolon.
}

#endif  // _MSC_VER