From a4ccef622cad5c1cdcbce75be20816714a419fc3 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 15 Jan 2026 15:44:22 -0800 Subject: [PATCH 01/11] start --- src/tools/wasm-as.cpp | 26 ++++++++++++++++---------- src/tools/wasm-ctor-eval.cpp | 2 ++ src/tools/wasm-dis.cpp | 10 ++++++++-- src/tools/wasm-emscripten-finalize.cpp | 3 ++- src/tools/wasm-merge.cpp | 2 ++ src/tools/wasm-metadce.cpp | 2 ++ src/tools/wasm-opt.cpp | 3 +++ src/tools/wasm-shell.cpp | 2 ++ src/tools/wasm2js.cpp | 16 +++++++++++----- 9 files changed, 48 insertions(+), 18 deletions(-) diff --git a/src/tools/wasm-as.cpp b/src/tools/wasm-as.cpp index 8d0dbd6495b..36acd6eacea 100644 --- a/src/tools/wasm-as.cpp +++ b/src/tools/wasm-as.cpp @@ -131,19 +131,25 @@ int main(int argc, const char* argv[]) { if (options.debug) { std::cerr << "writing..." << std::endl; } - ModuleWriter writer(options.passOptions); - writer.setBinary(true); - writer.setDebugInfo(debugInfo); - if (sourceMapFilename.size()) { - writer.setSourceMapFilename(sourceMapFilename); - writer.setSourceMapUrl(sourceMapUrl); - } - if (symbolMap.size() > 0) { - writer.setSymbolMap(symbolMap); + + // Ensure the destructor of ModuleWriter runs before quick_exit. + { + ModuleWriter writer(options.passOptions); + writer.setBinary(true); + writer.setDebugInfo(debugInfo); + if (sourceMapFilename.size()) { + writer.setSourceMapFilename(sourceMapFilename); + writer.setSourceMapUrl(sourceMapUrl); + } + if (symbolMap.size() > 0) { + writer.setSymbolMap(symbolMap); + } + writer.write(wasm, options.extra["output"]); } - writer.write(wasm, options.extra["output"]); if (options.debug) { std::cerr << "Done." << std::endl; } + + std::quick_exit(0); } diff --git a/src/tools/wasm-ctor-eval.cpp b/src/tools/wasm-ctor-eval.cpp index 1407682faf9..24b67acb4de 100644 --- a/src/tools/wasm-ctor-eval.cpp +++ b/src/tools/wasm-ctor-eval.cpp @@ -1618,4 +1618,6 @@ int main(int argc, const char* argv[]) { writer.setDebugInfo(debugInfo); writer.write(wasm, options.extra["output"]); } + + std::quick_exit(0); } diff --git a/src/tools/wasm-dis.cpp b/src/tools/wasm-dis.cpp index be3e7bd10d9..89ec560ce73 100644 --- a/src/tools/wasm-dis.cpp +++ b/src/tools/wasm-dis.cpp @@ -98,10 +98,16 @@ int main(int argc, const char* argv[]) { if (options.debug) { std::cerr << "Printing..." << std::endl; } - Output output(options.extra["output"], Flags::Text); - output.getStream() << wasm << '\n'; + + // Ensure the destructor of Output runs before quick_exit. + { + Output output(options.extra["output"], Flags::Text); + output.getStream() << wasm << '\n'; + } if (options.debug) { std::cerr << "Done." << std::endl; } + + std::quick_exit(0); } diff --git a/src/tools/wasm-emscripten-finalize.cpp b/src/tools/wasm-emscripten-finalize.cpp index 53e3be196dc..b7e3e11fc72 100644 --- a/src/tools/wasm-emscripten-finalize.cpp +++ b/src/tools/wasm-emscripten-finalize.cpp @@ -289,5 +289,6 @@ int main(int argc, const char* argv[]) { } writer.write(wasm, output); } - return 0; + + std::quick_exit(0); } diff --git a/src/tools/wasm-merge.cpp b/src/tools/wasm-merge.cpp index d9a991a58cc..39a97fb0efe 100644 --- a/src/tools/wasm-merge.cpp +++ b/src/tools/wasm-merge.cpp @@ -832,4 +832,6 @@ Input source maps can be specified by adding an -ism option right after the modu } writer.write(merged, options.extra["output"]); } + + std::quick_exit(0); } diff --git a/src/tools/wasm-metadce.cpp b/src/tools/wasm-metadce.cpp index b677e575abf..66d99ec6e8a 100644 --- a/src/tools/wasm-metadce.cpp +++ b/src/tools/wasm-metadce.cpp @@ -674,4 +674,6 @@ int main(int argc, const char* argv[]) { // Clean up free(copy); + + std::quick_exit(0); } diff --git a/src/tools/wasm-opt.cpp b/src/tools/wasm-opt.cpp index 310544c9451..cc2772c4564 100644 --- a/src/tools/wasm-opt.cpp +++ b/src/tools/wasm-opt.cpp @@ -496,5 +496,8 @@ For more on how to optimize effectively, see Fatal() << "extra fuzz command output differs\n"; } } + + std::quick_exit(0); + return 0; } diff --git a/src/tools/wasm-shell.cpp b/src/tools/wasm-shell.cpp index 046bb33cecd..b8a02fb0dcc 100644 --- a/src/tools/wasm-shell.cpp +++ b/src/tools/wasm-shell.cpp @@ -603,4 +603,6 @@ int main(int argc, const char* argv[]) { Colors::bold(std::cerr); std::cerr << "all checks passed.\n"; Colors::normal(std::cerr); + + std::quick_exit(0); } diff --git a/src/tools/wasm2js.cpp b/src/tools/wasm2js.cpp index c6277c6c30f..2515905e18e 100644 --- a/src/tools/wasm2js.cpp +++ b/src/tools/wasm2js.cpp @@ -993,14 +993,20 @@ int main(int argc, const char* argv[]) { if (options.debug) { std::cerr << "j-printing..." << std::endl; } - Output output(options.extra["output"], Flags::Text); - if (script && options.extra["asserts"] == "1") { - AssertionEmitter(*script, output, flags, options).emit(); - } else { - emitWasm(*wasm, output, flags, options.passOptions, "asmFunc"); + + // Ensure the destructor of Output runs before quick_exit. + { + Output output(options.extra["output"], Flags::Text); + if (script && options.extra["asserts"] == "1") { + AssertionEmitter(*script, output, flags, options).emit(); + } else { + emitWasm(*wasm, output, flags, options.passOptions, "asmFunc"); + } } if (options.debug) { std::cerr << "done." << std::endl; } + + std::quick_exit(0); } From 1728cd79c2f824bd466f69a812333a1c515500c8 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 15 Jan 2026 15:49:56 -0800 Subject: [PATCH 02/11] nice --- src/support/file.cpp | 7 +++++++ src/support/file.h | 8 +++++++- src/tools/wasm-as.cpp | 2 +- src/tools/wasm-ctor-eval.cpp | 2 +- src/tools/wasm-dis.cpp | 2 +- src/tools/wasm-emscripten-finalize.cpp | 2 +- src/tools/wasm-merge.cpp | 2 +- src/tools/wasm-metadce.cpp | 2 +- src/tools/wasm-opt.cpp | 4 +--- src/tools/wasm-shell.cpp | 2 +- src/tools/wasm2js.cpp | 2 +- 11 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/support/file.cpp b/src/support/file.cpp index 08b9e31af91..c43b4be10d7 100644 --- a/src/support/file.cpp +++ b/src/support/file.cpp @@ -135,3 +135,10 @@ size_t wasm::file_size(std::string filename) { std::ifstream::ate | std::ifstream::binary); return infile.tellg(); } + +void flush_and_quick_exit() { + std::cout << std::flush; + std::cerr << std::flush; + std::quick_exit(0); +} + diff --git a/src/support/file.h b/src/support/file.h index ae91831c98f..f81de9f6444 100644 --- a/src/support/file.h +++ b/src/support/file.h @@ -72,9 +72,15 @@ class Output { // Copies a file to another file void copy_file(std::string input, std::string output); -// Retusn the size of a file +// Return the size of a file size_t file_size(std::string filename); +// Flush stdout and stderr, and quickly exit. This assumes that all files that +// need flushing have been flushed, that is, no global ctors or RAII in main's +// top level are depended on (using quick_exit then avoids running global dtors, +// which saves otherwise wasted time). +void flush_and_quick_exit(); + } // namespace wasm #endif // wasm_support_file_h diff --git a/src/tools/wasm-as.cpp b/src/tools/wasm-as.cpp index 36acd6eacea..3db086c1a55 100644 --- a/src/tools/wasm-as.cpp +++ b/src/tools/wasm-as.cpp @@ -151,5 +151,5 @@ int main(int argc, const char* argv[]) { std::cerr << "Done." << std::endl; } - std::quick_exit(0); + flush_and_quick_exit(); } diff --git a/src/tools/wasm-ctor-eval.cpp b/src/tools/wasm-ctor-eval.cpp index 24b67acb4de..2d8dda63ee1 100644 --- a/src/tools/wasm-ctor-eval.cpp +++ b/src/tools/wasm-ctor-eval.cpp @@ -1619,5 +1619,5 @@ int main(int argc, const char* argv[]) { writer.write(wasm, options.extra["output"]); } - std::quick_exit(0); + flush_and_quick_exit(); } diff --git a/src/tools/wasm-dis.cpp b/src/tools/wasm-dis.cpp index 89ec560ce73..bcd7241743b 100644 --- a/src/tools/wasm-dis.cpp +++ b/src/tools/wasm-dis.cpp @@ -109,5 +109,5 @@ int main(int argc, const char* argv[]) { std::cerr << "Done." << std::endl; } - std::quick_exit(0); + flush_and_quick_exit(); } diff --git a/src/tools/wasm-emscripten-finalize.cpp b/src/tools/wasm-emscripten-finalize.cpp index b7e3e11fc72..303664d88d5 100644 --- a/src/tools/wasm-emscripten-finalize.cpp +++ b/src/tools/wasm-emscripten-finalize.cpp @@ -290,5 +290,5 @@ int main(int argc, const char* argv[]) { writer.write(wasm, output); } - std::quick_exit(0); + flush_and_quick_exit(); } diff --git a/src/tools/wasm-merge.cpp b/src/tools/wasm-merge.cpp index 39a97fb0efe..d44115399f2 100644 --- a/src/tools/wasm-merge.cpp +++ b/src/tools/wasm-merge.cpp @@ -833,5 +833,5 @@ Input source maps can be specified by adding an -ism option right after the modu writer.write(merged, options.extra["output"]); } - std::quick_exit(0); + flush_and_quick_exit(); } diff --git a/src/tools/wasm-metadce.cpp b/src/tools/wasm-metadce.cpp index 66d99ec6e8a..e12209b4d17 100644 --- a/src/tools/wasm-metadce.cpp +++ b/src/tools/wasm-metadce.cpp @@ -675,5 +675,5 @@ int main(int argc, const char* argv[]) { // Clean up free(copy); - std::quick_exit(0); + flush_and_quick_exit(); } diff --git a/src/tools/wasm-opt.cpp b/src/tools/wasm-opt.cpp index cc2772c4564..a788478be4a 100644 --- a/src/tools/wasm-opt.cpp +++ b/src/tools/wasm-opt.cpp @@ -497,7 +497,5 @@ For more on how to optimize effectively, see } } - std::quick_exit(0); - - return 0; + flush_and_quick_exit(); } diff --git a/src/tools/wasm-shell.cpp b/src/tools/wasm-shell.cpp index b8a02fb0dcc..8ec13026ace 100644 --- a/src/tools/wasm-shell.cpp +++ b/src/tools/wasm-shell.cpp @@ -604,5 +604,5 @@ int main(int argc, const char* argv[]) { std::cerr << "all checks passed.\n"; Colors::normal(std::cerr); - std::quick_exit(0); + flush_and_quick_exit(); } diff --git a/src/tools/wasm2js.cpp b/src/tools/wasm2js.cpp index 2515905e18e..e7da05df890 100644 --- a/src/tools/wasm2js.cpp +++ b/src/tools/wasm2js.cpp @@ -1008,5 +1008,5 @@ int main(int argc, const char* argv[]) { std::cerr << "done." << std::endl; } - std::quick_exit(0); + flush_and_quick_exit(); } From a6dc74ddc18d4da3031f0f101016d92b720a6d67 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 15 Jan 2026 15:52:15 -0800 Subject: [PATCH 03/11] opos --- src/support/file.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/support/file.cpp b/src/support/file.cpp index c43b4be10d7..6760bf2bb45 100644 --- a/src/support/file.cpp +++ b/src/support/file.cpp @@ -136,7 +136,7 @@ size_t wasm::file_size(std::string filename) { return infile.tellg(); } -void flush_and_quick_exit() { +void wasm::flush_and_quick_exit() { std::cout << std::flush; std::cerr << std::flush; std::quick_exit(0); From c6732cb5acd90c386317541a2ce6f5124607b2f4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 15 Jan 2026 15:52:24 -0800 Subject: [PATCH 04/11] fmt --- src/support/file.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/support/file.cpp b/src/support/file.cpp index 6760bf2bb45..931f9328355 100644 --- a/src/support/file.cpp +++ b/src/support/file.cpp @@ -141,4 +141,3 @@ void wasm::flush_and_quick_exit() { std::cerr << std::flush; std::quick_exit(0); } - From 2a9e76b4f1b296da0d2bdf6b0a6ea0c301dbd018 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 15 Jan 2026 16:37:33 -0800 Subject: [PATCH 05/11] fix --- src/tools/wasm-opt.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/tools/wasm-opt.cpp b/src/tools/wasm-opt.cpp index a788478be4a..8736f6f0627 100644 --- a/src/tools/wasm-opt.cpp +++ b/src/tools/wasm-opt.cpp @@ -476,18 +476,23 @@ For more on how to optimize effectively, see std::cerr << "warning: no output file specified, not emitting output\n"; } } + + flush_and_quick_exit(); return 0; } - BYN_TRACE("writing...\n"); - ModuleWriter writer(options.passOptions); - writer.setBinary(emitBinary); - writer.setDebugInfo(options.passOptions.debugInfo); - if (outputSourceMapFilename.size()) { - writer.setSourceMapFilename(outputSourceMapFilename); - writer.setSourceMapUrl(outputSourceMapUrl); + // Ensure the destructor of ModuleWriter runs before quick_exit. + { + BYN_TRACE("writing...\n"); + ModuleWriter writer(options.passOptions); + writer.setBinary(emitBinary); + writer.setDebugInfo(options.passOptions.debugInfo); + if (outputSourceMapFilename.size()) { + writer.setSourceMapFilename(outputSourceMapFilename); + writer.setSourceMapUrl(outputSourceMapUrl); + } + writer.write(wasm, options.extra["output"]); } - writer.write(wasm, options.extra["output"]); if (extraFuzzCommand.size() > 0) { auto secondOutput = runCommand(extraFuzzCommand); From 4b73e3551c0108560d2df09adcbc82aab98dc4a4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 16 Jan 2026 08:04:55 -0800 Subject: [PATCH 06/11] [[noreturn]] --- src/support/file.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/support/file.h b/src/support/file.h index f81de9f6444..6dc108db82c 100644 --- a/src/support/file.h +++ b/src/support/file.h @@ -79,7 +79,7 @@ size_t file_size(std::string filename); // need flushing have been flushed, that is, no global ctors or RAII in main's // top level are depended on (using quick_exit then avoids running global dtors, // which saves otherwise wasted time). -void flush_and_quick_exit(); +[[noreturn]] void flush_and_quick_exit(); } // namespace wasm From 8afe5b17f1a9bdb5057134fbbbfe0ffeab156341 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 16 Jan 2026 11:04:57 -0800 Subject: [PATCH 07/11] explicit 0 --- src/support/file.cpp | 4 ++-- src/support/file.h | 2 +- src/tools/wasm-as.cpp | 2 +- src/tools/wasm-ctor-eval.cpp | 2 +- src/tools/wasm-dis.cpp | 2 +- src/tools/wasm-emscripten-finalize.cpp | 2 +- src/tools/wasm-merge.cpp | 2 +- src/tools/wasm-metadce.cpp | 2 +- src/tools/wasm-opt.cpp | 4 ++-- src/tools/wasm-shell.cpp | 2 +- src/tools/wasm2js.cpp | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/support/file.cpp b/src/support/file.cpp index 931f9328355..dbb44afd643 100644 --- a/src/support/file.cpp +++ b/src/support/file.cpp @@ -136,8 +136,8 @@ size_t wasm::file_size(std::string filename) { return infile.tellg(); } -void wasm::flush_and_quick_exit() { +void wasm::flush_and_quick_exit(int code) { std::cout << std::flush; std::cerr << std::flush; - std::quick_exit(0); + std::quick_exit(code); } diff --git a/src/support/file.h b/src/support/file.h index 6dc108db82c..0726417285f 100644 --- a/src/support/file.h +++ b/src/support/file.h @@ -79,7 +79,7 @@ size_t file_size(std::string filename); // need flushing have been flushed, that is, no global ctors or RAII in main's // top level are depended on (using quick_exit then avoids running global dtors, // which saves otherwise wasted time). -[[noreturn]] void flush_and_quick_exit(); +[[noreturn]] void flush_and_quick_exit(int code); } // namespace wasm diff --git a/src/tools/wasm-as.cpp b/src/tools/wasm-as.cpp index 3db086c1a55..3eabdef3120 100644 --- a/src/tools/wasm-as.cpp +++ b/src/tools/wasm-as.cpp @@ -151,5 +151,5 @@ int main(int argc, const char* argv[]) { std::cerr << "Done." << std::endl; } - flush_and_quick_exit(); + flush_and_quick_exit(0); } diff --git a/src/tools/wasm-ctor-eval.cpp b/src/tools/wasm-ctor-eval.cpp index 2d8dda63ee1..fae516d8f6a 100644 --- a/src/tools/wasm-ctor-eval.cpp +++ b/src/tools/wasm-ctor-eval.cpp @@ -1619,5 +1619,5 @@ int main(int argc, const char* argv[]) { writer.write(wasm, options.extra["output"]); } - flush_and_quick_exit(); + flush_and_quick_exit(0); } diff --git a/src/tools/wasm-dis.cpp b/src/tools/wasm-dis.cpp index bcd7241743b..d69cc1f96cc 100644 --- a/src/tools/wasm-dis.cpp +++ b/src/tools/wasm-dis.cpp @@ -109,5 +109,5 @@ int main(int argc, const char* argv[]) { std::cerr << "Done." << std::endl; } - flush_and_quick_exit(); + flush_and_quick_exit(0); } diff --git a/src/tools/wasm-emscripten-finalize.cpp b/src/tools/wasm-emscripten-finalize.cpp index 303664d88d5..7ab7fd55cff 100644 --- a/src/tools/wasm-emscripten-finalize.cpp +++ b/src/tools/wasm-emscripten-finalize.cpp @@ -290,5 +290,5 @@ int main(int argc, const char* argv[]) { writer.write(wasm, output); } - flush_and_quick_exit(); + flush_and_quick_exit(0); } diff --git a/src/tools/wasm-merge.cpp b/src/tools/wasm-merge.cpp index d44115399f2..3c354f745bf 100644 --- a/src/tools/wasm-merge.cpp +++ b/src/tools/wasm-merge.cpp @@ -833,5 +833,5 @@ Input source maps can be specified by adding an -ism option right after the modu writer.write(merged, options.extra["output"]); } - flush_and_quick_exit(); + flush_and_quick_exit(0); } diff --git a/src/tools/wasm-metadce.cpp b/src/tools/wasm-metadce.cpp index e12209b4d17..299cb2f63c9 100644 --- a/src/tools/wasm-metadce.cpp +++ b/src/tools/wasm-metadce.cpp @@ -675,5 +675,5 @@ int main(int argc, const char* argv[]) { // Clean up free(copy); - flush_and_quick_exit(); + flush_and_quick_exit(0); } diff --git a/src/tools/wasm-opt.cpp b/src/tools/wasm-opt.cpp index 8736f6f0627..d3ba797a674 100644 --- a/src/tools/wasm-opt.cpp +++ b/src/tools/wasm-opt.cpp @@ -477,7 +477,7 @@ For more on how to optimize effectively, see } } - flush_and_quick_exit(); + flush_and_quick_exit(0); return 0; } @@ -502,5 +502,5 @@ For more on how to optimize effectively, see } } - flush_and_quick_exit(); + flush_and_quick_exit(0); } diff --git a/src/tools/wasm-shell.cpp b/src/tools/wasm-shell.cpp index 8ec13026ace..2750f9d0b1e 100644 --- a/src/tools/wasm-shell.cpp +++ b/src/tools/wasm-shell.cpp @@ -604,5 +604,5 @@ int main(int argc, const char* argv[]) { std::cerr << "all checks passed.\n"; Colors::normal(std::cerr); - flush_and_quick_exit(); + flush_and_quick_exit(0); } diff --git a/src/tools/wasm2js.cpp b/src/tools/wasm2js.cpp index e7da05df890..94faf43c821 100644 --- a/src/tools/wasm2js.cpp +++ b/src/tools/wasm2js.cpp @@ -1008,5 +1008,5 @@ int main(int argc, const char* argv[]) { std::cerr << "done." << std::endl; } - flush_and_quick_exit(); + flush_and_quick_exit(0); } From 2db41f6782613efc348425d1ce6a2dd0a7d1a6a5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 16 Jan 2026 11:31:24 -0800 Subject: [PATCH 08/11] add C flushing --- src/support/file.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/support/file.cpp b/src/support/file.cpp index dbb44afd643..97b68333c1d 100644 --- a/src/support/file.cpp +++ b/src/support/file.cpp @@ -137,7 +137,13 @@ size_t wasm::file_size(std::string filename) { } void wasm::flush_and_quick_exit(int code) { + // We expect C++ files to be flushed by their destructors already. Flush the + // standard streams manually. std::cout << std::flush; std::cerr << std::flush; + + // To be safe, also flush at the C level. + fflush(NULL); + std::quick_exit(code); } From 9a4a61fc6adca320f28697478743eddc3fd53784 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 16 Jan 2026 13:23:05 -0800 Subject: [PATCH 09/11] sanitizers --- src/support/file.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/support/file.cpp b/src/support/file.cpp index 97b68333c1d..be06980d591 100644 --- a/src/support/file.cpp +++ b/src/support/file.cpp @@ -145,5 +145,13 @@ void wasm::flush_and_quick_exit(int code) { // To be safe, also flush at the C level. fflush(NULL); +#if __has_feature(address_sanitizer) || __has_feature(thread_sanitizer) || \ + __has_feature(memory_sanitizer) || __has_feature(leak_sanitizer) || \ + __has_feature(undefined_behavior_sanitizer) + // Avoid quick_exit when using sanitizers, so that leak checks and other + // things can run during shutdown normally. + std::exit(code); +#else std::quick_exit(code); +#endif } From 387ffb958833f015599485099b4b97748097dc87 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 16 Jan 2026 15:57:21 -0800 Subject: [PATCH 10/11] cause lsan errors? --- src/wasm-interpreter.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 89b767af2aa..fa06de5ce7e 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -373,7 +373,7 @@ class ExpressionRunner : public OverriddenVisitor { // Binaryen is generally not used in long-running programs so we just ignore // such leaks for now. // TODO: Add a cycle collector? - __lsan_ignore_object(allocation.get()); + //__lsan_ignore_object(allocation.get()); #endif return Literal(allocation, type.getHeapType()); } @@ -382,7 +382,7 @@ class ExpressionRunner : public OverriddenVisitor { Literal makeExnData(Tag* tag, const Literals& payload) { auto allocation = std::make_shared(tag, payload); #if __has_feature(leak_sanitizer) || __has_feature(address_sanitizer) - __lsan_ignore_object(allocation.get()); + //__lsan_ignore_object(allocation.get()); #endif return Literal(allocation); } @@ -406,7 +406,7 @@ class ExpressionRunner : public OverriddenVisitor { // function. auto allocation = std::make_shared(name, this); #if __has_feature(leak_sanitizer) || __has_feature(address_sanitizer) - __lsan_ignore_object(allocation.get()); + //__lsan_ignore_object(allocation.get()); #endif return Literal(allocation, type); } @@ -5206,7 +5206,7 @@ class ModuleRunner : public ModuleRunnerBase { return callFunction(name, arguments); }); #if __has_feature(leak_sanitizer) || __has_feature(address_sanitizer) - __lsan_ignore_object(allocation.get()); + //__lsan_ignore_object(allocation.get()); #endif return Literal(allocation, type); } From 2cb69105247bdba8891981f8787ca7e5240306a8 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 16 Jan 2026 16:24:20 -0800 Subject: [PATCH 11/11] Revert "cause lsan errors?" This reverts commit 387ffb958833f015599485099b4b97748097dc87. --- src/wasm-interpreter.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index fa06de5ce7e..89b767af2aa 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -373,7 +373,7 @@ class ExpressionRunner : public OverriddenVisitor { // Binaryen is generally not used in long-running programs so we just ignore // such leaks for now. // TODO: Add a cycle collector? - //__lsan_ignore_object(allocation.get()); + __lsan_ignore_object(allocation.get()); #endif return Literal(allocation, type.getHeapType()); } @@ -382,7 +382,7 @@ class ExpressionRunner : public OverriddenVisitor { Literal makeExnData(Tag* tag, const Literals& payload) { auto allocation = std::make_shared(tag, payload); #if __has_feature(leak_sanitizer) || __has_feature(address_sanitizer) - //__lsan_ignore_object(allocation.get()); + __lsan_ignore_object(allocation.get()); #endif return Literal(allocation); } @@ -406,7 +406,7 @@ class ExpressionRunner : public OverriddenVisitor { // function. auto allocation = std::make_shared(name, this); #if __has_feature(leak_sanitizer) || __has_feature(address_sanitizer) - //__lsan_ignore_object(allocation.get()); + __lsan_ignore_object(allocation.get()); #endif return Literal(allocation, type); } @@ -5206,7 +5206,7 @@ class ModuleRunner : public ModuleRunnerBase { return callFunction(name, arguments); }); #if __has_feature(leak_sanitizer) || __has_feature(address_sanitizer) - //__lsan_ignore_object(allocation.get()); + __lsan_ignore_object(allocation.get()); #endif return Literal(allocation, type); }