2424#include " ubsan/ubsan_flags.h"
2525#include " ubsan/ubsan_platform.h"
2626
27+ #if SANITIZER_EMSCRIPTEN
28+ #include < emscripten/heap.h>
29+ #include " emscripten_internal.h"
30+ #endif
31+
32+
2733namespace __asan {
2834
2935Flags asan_flags_dont_use_directly; // use via flags().
@@ -70,7 +76,11 @@ static void InitializeDefaultFlags() {
7076 CommonFlags cf;
7177 cf.CopyFrom (*common_flags ());
7278 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.
7382 cf.external_symbolizer_path = GetEnv (" ASAN_SYMBOLIZER_PATH" );
83+ #endif
7484 cf.malloc_context_size = kDefaultMallocContextSize ;
7585 cf.intercept_tls_get_addr = true ;
7686 cf.exitcode = 1 ;
@@ -129,6 +139,23 @@ static void InitializeDefaultFlags() {
129139 lsan_parser.ParseString (lsan_default_options);
130140#endif
131141
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
132159 // Override from command line.
133160 asan_parser.ParseStringFromEnv (" ASAN_OPTIONS" );
134161#if CAN_SANITIZE_LEAKS
@@ -137,9 +164,15 @@ static void InitializeDefaultFlags() {
137164#if CAN_SANITIZE_UB
138165 ubsan_parser.ParseStringFromEnv (" UBSAN_OPTIONS" );
139166#endif
167+ #endif // SANITIZER_EMSCRIPTEN
140168
141169 InitializeCommonFlags ();
142170
171+ #if SANITIZER_EMSCRIPTEN
172+ if (common_flags ()->malloc_context_size <= 1 )
173+ StackTrace::snapshot_stack = false ;
174+ #endif // SANITIZER_EMSCRIPTEN
175+ //
143176 // TODO(samsonov): print all of the flags (ASan, LSan, common).
144177 DisplayHelpMessages (&asan_parser);
145178}
0 commit comments