24
24
#include " ubsan/ubsan_flags.h"
25
25
#include " ubsan/ubsan_platform.h"
26
26
27
+ #if SANITIZER_EMSCRIPTEN
28
+ #include < emscripten/heap.h>
29
+ #include " emscripten_internal.h"
30
+ #endif
31
+
32
+
27
33
namespace __asan {
28
34
29
35
Flags asan_flags_dont_use_directly; // use via flags().
@@ -70,7 +76,11 @@ static void InitializeDefaultFlags() {
70
76
CommonFlags cf;
71
77
cf.CopyFrom (*common_flags ());
72
78
cf.detect_leaks = cf.detect_leaks && CAN_SANITIZE_LEAKS;
79
+ #if !SANITIZER_EMSCRIPTEN
80
+ // getenv on emscripten uses malloc, which we can't when using LSan.
81
+ // You can't run external symbolizer executables anyway.
73
82
cf.external_symbolizer_path = GetEnv (" ASAN_SYMBOLIZER_PATH" );
83
+ #endif
74
84
cf.malloc_context_size = kDefaultMallocContextSize ;
75
85
cf.intercept_tls_get_addr = true ;
76
86
cf.exitcode = 1 ;
@@ -129,6 +139,23 @@ static void InitializeDefaultFlags() {
129
139
lsan_parser.ParseString (lsan_default_options);
130
140
#endif
131
141
142
+ #if SANITIZER_EMSCRIPTEN
143
+ char *options;
144
+ // Override from Emscripten Module.
145
+ // TODO: add EM_ASM_I64 and avoid using a double for a 64-bit pointer.
146
+ #define MAKE_OPTION_LOAD (parser, name ) \
147
+ options = _emscripten_sanitizer_get_option (name); \
148
+ parser.ParseString (options); \
149
+ emscripten_builtin_free (options);
150
+
151
+ MAKE_OPTION_LOAD (asan_parser, " ASAN_OPTIONS" );
152
+ #if CAN_SANITIZE_LEAKS
153
+ MAKE_OPTION_LOAD (lsan_parser, " LSAN_OPTIONS" );
154
+ #endif
155
+ #if CAN_SANITIZE_UB
156
+ MAKE_OPTION_LOAD (ubsan_parser, " UBSAN_OPTIONS" );
157
+ #endif
158
+ #else
132
159
// Override from command line.
133
160
asan_parser.ParseStringFromEnv (" ASAN_OPTIONS" );
134
161
#if CAN_SANITIZE_LEAKS
@@ -137,9 +164,15 @@ static void InitializeDefaultFlags() {
137
164
#if CAN_SANITIZE_UB
138
165
ubsan_parser.ParseStringFromEnv (" UBSAN_OPTIONS" );
139
166
#endif
167
+ #endif // SANITIZER_EMSCRIPTEN
140
168
141
169
InitializeCommonFlags ();
142
170
171
+ #if SANITIZER_EMSCRIPTEN
172
+ if (common_flags ()->malloc_context_size <= 1 )
173
+ StackTrace::snapshot_stack = false ;
174
+ #endif // SANITIZER_EMSCRIPTEN
175
+ //
143
176
// TODO(samsonov): print all of the flags (ASan, LSan, common).
144
177
DisplayHelpMessages (&asan_parser);
145
178
}
0 commit comments