Skip to content

Fix cs_loader memory leak on failed script load.#630

Closed
ROKUMATE wants to merge 4 commits intometacall:developfrom
ROKUMATE:issue-378-fix
Closed

Fix cs_loader memory leak on failed script load.#630
ROKUMATE wants to merge 4 commits intometacall:developfrom
ROKUMATE:issue-378-fix

Conversation

@ROKUMATE
Copy link
Contributor

Description

When LoadFromSourceFunctions in the C# loader encountered a compilation error, it returned false immediately without releasing the CSharpCompilation object or its MetadataReference array. Each MetadataReference.CreateFromFile holds a native System.Reflection.Metadata PE reader backing store. Summed across all runtime DLLs this produced the ~53 MB leak reported by AddressSanitizer.

Changes:

  • LoaderBase.cs: null out references and compilation on every failure path and force a GC cycle before returning, so the native backing stores are freed before process exit.
  • LoaderV2.cs: add CollectibleAssemblyLoadContext and switch MakeAssembly to use alc.LoadFromStream() instead of Assembly.Load(byte[]). This scopes compiled assemblies to a collectible context so they can be unloaded by the GC rather than being permanently rooted in the default context.
  • lsan.supp: update comment to reflect that the Roslyn-induced leak is fixed at source; the System.Private.CoreLib.dll suppression now covers only intentional CoreCLR static-lifetime allocations.

Fixes #378

Type of change

  • Bug fix (non-breaking change which fixes an issue)

Checklist:

  • I have performed a self-review of my own code.
  • I have commented my code, particularly in hard-to-understand areas.
  • I have made corresponding changes to the documentation.
  • My changes generate no new warnings.
  • I have added tests/screenshots (if any) that prove my fix is effective or that my feature works.
  • I have tested the tests implicated (if any) by my own code and they pass (make test or ctest -VV -R <test-name>).
  • If my change is significant or breaking, I have passed all tests with ./docker-compose.sh test &> output and attached the output.
  • I have tested my code with OPTION_BUILD_ADDRESS_SANITIZER or ./docker-compose.sh test-address-sanitizer &> output and OPTION_TEST_MEMORYCHECK.
  • I have tested my code with OPTION_BUILD_THREAD_SANITIZER or ./docker-compose.sh test-thread-sanitizer &> output.
  • I have tested with Helgrind in case my code works with threading.
  • I have run make clang-format in order to format my code and my code follows the style guidelines.

@ROKUMATE
Copy link
Contributor Author


166/171 Test #170: cli_cmd_plugin ...................................   Passed    0.43 sec
167/171 Test #146: metacall-py-init-bench ...........................   Passed    1.94 sec
168/171 Test   #1: ts_loader_bootstrap ..............................   Passed    5.40 sec
169/171 Test   #6: rb_port_test_executable ..........................   Passed    6.64 sec
170/171 Test #144: log-bench ........................................   Passed   61.07 sec
171/171 Test #145: metacall-py-call-bench ...........................   Passed  274.69 sec

26% tests passed, 127 tests failed out of 171

Label Time Summary:Errors while running CTest

MEMCHECK_IGNORE                                   =   0.33 sec*proc (5 tests)
adt-map-test                                      =   0.14 sec*proc (1 test)
adt-set-test                                      =   0.04 sec*proc (1 test)
adt-trie-test                                     =   0.04 sec*proc (1 test)
adt-vector-test                                   =   0.02 sec*proc (1 test)
configuration-test                                =   0.02 sec*proc (1 test)
detour-test                                       =   0.05 sec*proc (1 test)
dynlink-test                                      =   0.02 sec*proc (1 test)
environment-test                                  =   0.04 sec*proc (1 test)
log-bench                                         =  61.07 sec*proc (1 test)
log-custom-test                                   =   0.04 sec*proc (1 test)
log-test                                          =   0.05 sec*proc (1 test)
metacall-backtrace-plugin-test                    =   0.09 sec*proc (1 test)
metacall-c-lib-test                               =   0.08 sec*proc (1 test)
metacall-c-test                                   =   0.07 sec*proc (1 test)
metacall-callback-complex-test                    =   0.05 sec*proc (1 test)
metacall-cast-test                                =   0.05 sec*proc (1 test)
metacall-clear-test                               =   0.07 sec*proc (1 test)
metacall-cobol-test                               =   0.04 sec*proc (1 test)
metacall-configuration-default-test               =   0.04 sec*proc (1 test)
metacall-configuration-exec-path-test             =   0.09 sec*proc (1 test)
metacall-configuration-exec-relative-path-test    =   0.08 sec*proc (1 test)
metacall-cs-test                                  =   0.06 sec*proc (1 test)
metacall-csharp-static-class-test                 =   0.03 sec*proc (1 test)
metacall-depends-test                             =   0.05 sec*proc (1 test)
metacall-distributable-test                       =   0.10 sec*proc (1 test)
metacall-ducktype-test                            =   0.07 sec*proc (1 test)
metacall-duplicated-handle-test                   =   0.06 sec*proc (1 test)
metacall-duplicated-symbols-test                  =   0.05 sec*proc (1 test)
metacall-dynlink-path-test                        =   0.04 sec*proc (1 test)
metacall-ext-test                                 =   0.12 sec*proc (1 test)
metacall-file-fail-test                           =   0.05 sec*proc (1 test)
metacall-file-glob-test                           =   0.06 sec*proc (1 test)
metacall-file-test                                =   0.05 sec*proc (1 test)
metacall-fork-test                                =   0.03 sec*proc (1 test)
metacall-function-test                            =   0.03 sec*proc (1 test)
metacall-handle-export-test                       =   0.06 sec*proc (1 test)
metacall-handle-get-test                          =   0.06 sec*proc (1 test)
metacall-init-fini-test                           =   0.05 sec*proc (1 test)
metacall-initialize-destroy-multiple-node-test    =   0.03 sec*proc (1 test)
metacall-initialize-destroy-multiple-test         =   0.05 sec*proc (1 test)
metacall-initialize-ex-test                       =   0.04 sec*proc (1 test)
metacall-initialize-test                          =   0.04 sec*proc (1 test)
metacall-inspect-test                             =   0.04 sec*proc (1 test)
metacall-integration-test                         =   0.06 sec*proc (1 test)
metacall-invalid-loader-test                      =   0.06 sec*proc (1 test)
metacall-java-test                                =   0.06 sec*proc (1 test)
metacall-library-path-without-env-vars-test       =   0.03 sec*proc (1 test)
metacall-load-configuration-fail-test             =   0.06 sec*proc (1 test)
metacall-load-configuration-node-python-test      =   0.07 sec*proc (1 test)
metacall-load-configuration-python-node-test      =   0.07 sec*proc (1 test)
metacall-load-configuration-relative-test         =   0.05 sec*proc (1 test)
metacall-load-configuration-test                  =   0.06 sec*proc (1 test)
metacall-load-memory-empty-test                   =   0.05 sec*proc (1 test)
metacall-load-memory-test                         =   0.07 sec*proc (1 test)
metacall-logs-test                                =   2.24 sec*proc (1 test)
metacall-map-await-test                           =   0.04 sec*proc (1 test)
metacall-map-test                                 =   0.06 sec*proc (1 test)
metacall-node-async-multiple-test                 =   0.10 sec*proc (1 test)
metacall-node-async-resources-test                =   0.07 sec*proc (1 test)
metacall-node-async-test                          =   0.06 sec*proc (1 test)
metacall-node-await-chain-test                    =   0.06 sec*proc (1 test)
metacall-node-call-bench                          =   0.29 sec*proc (1 test)
metacall-node-call-test                           =   0.06 sec*proc (1 test)
metacall-node-callback-test                       =   0.07 sec*proc (1 test)
metacall-node-clear-mem-test                      =   0.10 sec*proc (1 test)
metacall-node-event-loop-signal-test              =   0.10 sec*proc (1 test)
metacall-node-event-loop-test                     =   0.03 sec*proc (1 test)
metacall-node-exception-test                      =   0.10 sec*proc (1 test)
metacall-node-extension-test                      =   0.05 sec*proc (1 test)
metacall-node-fail-env-var-test                   =   0.04 sec*proc (1 test)
metacall-node-fail-load-leak-test                 =   0.07 sec*proc (1 test)
metacall-node-fail-test                           =   0.04 sec*proc (1 test)
metacall-node-inline-test                         =   0.06 sec*proc (1 test)
metacall-node-multithread-deadlock-test           =   0.05 sec*proc (1 test)
metacall-node-native-code-test                    =   0.07 sec*proc (1 test)
metacall-node-port-await-test                     =   0.06 sec*proc (1 test)
metacall-node-port-c-lib-test                     =   0.05 sec*proc (1 test)
metacall-node-port-test                           =   0.06 sec*proc (1 test)
metacall-node-python-async-after-destroy-test     =   0.11 sec*proc (1 test)
metacall-node-python-await-test                   =   0.11 sec*proc (1 test)
metacall-node-python-deadlock-test                =   0.08 sec*proc (1 test)
metacall-node-python-exception-test               =   0.12 sec*proc (1 test)
metacall-node-python-port-mock-test               =   0.06 sec*proc (1 test)
metacall-node-python-port-ruby-test               =   0.05 sec*proc (1 test)
metacall-node-python-ruby-test                    =   0.03 sec*proc (1 test)
metacall-node-reentrant-test                      =   0.06 sec*proc (1 test)
metacall-node-test                                =   0.04 sec*proc (1 test)
metacall-node-typescript-test                     =   0.08 sec*proc (1 test)
metacall-plugin-extension-local-test              =   0.09 sec*proc (1 test)
metacall-plugin-extension-test                    =   0.09 sec*proc (1 test)
metacall-py-call-bench                            = 274.69 sec*proc (1 test)
metacall-py-init-bench                            =   1.94 sec*proc (1 test)
metacall-python-builtins-test                     =   0.06 sec*proc (1 test)
metacall-python-callback-test                     =   0.05 sec*proc (1 test)
metacall-python-dict-test                         =   0.07 sec*proc (1 test)
metacall-python-exception-test                    =   0.04 sec*proc (1 test)
metacall-python-fail-test                         =   0.04 sec*proc (1 test)
metacall-python-gc-test                           =   0.08 sec*proc (1 test)
metacall-python-object-class-test                 =   0.08 sec*proc (1 test)
metacall-python-open-test                         =   0.06 sec*proc (1 test)
metacall-python-pointer-test                      =   0.04 sec*proc (1 test)
metacall-python-port-callback-test                =   0.04 sec*proc (1 test)
metacall-python-port-https-test                   =   0.05 sec*proc (1 test)
metacall-python-port-import-test                  =   0.06 sec*proc (1 test)
metacall-python-port-pointer-test                 =   0.05 sec*proc (1 test)
metacall-python-port-test                         =   0.04 sec*proc (1 test)
metacall-python-reentrant-test                    =   0.05 sec*proc (1 test)
metacall-python-relative-path-test                =   0.05 sec*proc (1 test)
metacall-python-test                              =   0.09 sec*proc (1 test)
metacall-python-varargs-test                      =   0.03 sec*proc (1 test)
metacall-python-without-functions-test            =   0.03 sec*proc (1 test)
metacall-reinitialize-test                        =   0.04 sec*proc (1 test)
metacall-reload-functions-test                    =   0.03 sec*proc (1 test)
metacall-return-monad-test                        =   0.04 sec*proc (1 test)
metacall-rpc-test                                 =   0.53 sec*proc (1 test)
metacall-ruby-fail-empty-test                     =   0.07 sec*proc (1 test)
metacall-ruby-fail-test                           =   0.04 sec*proc (1 test)
metacall-ruby-object-class-test                   =   0.04 sec*proc (1 test)
metacall-ruby-parser-integration-test             =   0.05 sec*proc (1 test)
metacall-ruby-test                                =   0.05 sec*proc (1 test)
metacall-test                                     =   0.04 sec*proc (1 test)
metacall-typescript-call-map-test                 =   0.06 sec*proc (1 test)
metacall-typescript-jsx-default-test              =   0.04 sec*proc (1 test)
metacall-typescript-node-test                     =   0.06 sec*proc (1 test)
metacall-typescript-require-test                  =   0.06 sec*proc (1 test)
metacall-typescript-test                          =   0.05 sec*proc (1 test)
metacall-typescript-tsx-loop-fail-test            =   0.04 sec*proc (1 test)
metacall-typescript-tsx-test                      =   0.05 sec*proc (1 test)
metacall-version-test                             =   0.03 sec*proc (1 test)
metacallcli                                       =   0.33 sec*proc (1 test)
metacallcli-file                                  =   0.19 sec*proc (1 test)
metacallcli-file-fail                             =   0.16 sec*proc (1 test)
metacallcli-inspect-leak                          =   0.19 sec*proc (1 test)
metacallcli-node                                  =   0.14 sec*proc (1 test)
metacallcli-node-null                             =   0.21 sec*proc (1 test)
metacallcli-node-null-empty                       =   0.20 sec*proc (1 test)
metacallcli-node-null-undefined                   =   0.13 sec*proc (1 test)
metacallcli-node-port-py                          =   0.13 sec*proc (1 test)
metacallcli-node-port-py-rb                       =   0.18 sec*proc (1 test)
metacallcli-py-argv                               =   0.17 sec*proc (1 test)
metacallcli-py-exception                          =   0.18 sec*proc (1 test)
metacallcli-py-main                               =   0.15 sec*proc (1 test)
metacallcli-py-naming                             =   0.17 sec*proc (1 test)
metacallcli-py-port                               =   0.21 sec*proc (1 test)
metacallcli-py-port-rb                            =   0.17 sec*proc (1 test)
metacallcli-py-tsx                                =   0.16 sec*proc (1 test)
metacallcli-rb-simplest                           =   0.12 sec*proc (1 test)
metacallcli-ts                                    =   0.16 sec*proc (1 test)
metacallcli-tsx-loop-fail                         =   0.11 sec*proc (1 test)
metacallcli-tsx-templating                        =   0.12 sec*proc (1 test)
metacalllog                                       =   0.07 sec*proc (1 test)
node_port_test                                    =   0.28 sec*proc (1 test)
node_port_test_executable                         =   2.28 sec*proc (1 test)
portability-path-test                             =   0.02 sec*proc (1 test)
preprocessor-test                                 =   0.05 sec*proc (1 test)
py-loader-port-test                               =   0.04 sec*proc (1 test)
py_port_test                                      =   0.28 sec*proc (1 test)
rb-loader-parser-test                             =   0.03 sec*proc (1 test)
rb_port_test                                      =   0.27 sec*proc (1 test)
rb_port_test_executable                           =   6.64 sec*proc (1 test)
reflect-function-test                             =   0.04 sec*proc (1 test)
reflect-metadata-test                             =   0.02 sec*proc (1 test)
reflect-object-class-test                         =   0.06 sec*proc (1 test)
reflect-scope-test                                =   0.04 sec*proc (1 test)
reflect-value-cast-test                           =   0.09 sec*proc (1 test)
serial-test                                       =   0.01 sec*proc (1 test)
set-bench                                         =   0.56 sec*proc (1 test)
ts_loader_bootstrap                               =   5.40 sec*proc (1 test)

Total Test time (real) = 276.20 sec

The following tests FAILED:
          2 - node_port (SEGFAULT)                              node_port_test
          3 - node_port_test_executable (SEGFAULT)              node_port_test_executable
          4 - py_port (SEGFAULT)                                py_port_test
          5 - rb_port_test (SEGFAULT)                           rb_port_test
         26 - metacall-logs-test (Failed)                       metacall-logs-test
         27 - metacall-load-memory-test (Failed)                metacall-load-memory-test
         28 - metacall-load-memory-empty-test (Failed)          metacall-load-memory-empty-test
         29 - metacall-load-configuration-test (Failed)         metacall-load-configuration-test
         30 - metacall-load-configuration-fail-test (Failed)    metacall-load-configuration-fail-test
         31 - metacall-load-configuration-relative-test (Failed) metacall-load-configuration-relative-test
         32 - metacall-load-configuration-python-node-test (Failed) metacall-load-configuration-python-node-test
         33 - metacall-load-configuration-node-python-test (Failed) metacall-load-configuration-node-python-test
         34 - metacall-duplicated-handle-test (Failed)          metacall-duplicated-handle-test
         35 - metacall-duplicated-symbols-test (Failed)         metacall-duplicated-symbols-test
         36 - metacall-handle-export-test (Failed)              metacall-handle-export-test
         37 - metacall-handle-get-test (Failed)                 metacall-handle-get-test
         39 - metacall-node-test (Failed)                       metacall-node-test
         40 - metacall-node-event-loop-test (Failed)            metacall-node-event-loop-test
         41 - metacall-node-event-loop-signal-test (Failed)     metacall-node-event-loop-signal-test
         42 - metacall-node-call-test (Failed)                  metacall-node-call-test
         43 - metacall-node-inline-test (Failed)                metacall-node-inline-test
         44 - metacall-node-async-test (Failed)                 metacall-node-async-test
         45 - metacall-node-async-multiple-test (Failed)        metacall-node-async-multiple-test
         46 - metacall-node-reentrant-test (Failed)             metacall-node-reentrant-test
         47 - metacall-node-port-test (Failed)                  metacall-node-port-test
         48 - metacall-node-port-await-test (Failed)            metacall-node-port-await-test
         49 - metacall-node-port-c-lib-test (Failed)            metacall-node-port-c-lib-test
         50 - metacall-node-python-port-mock-test (Failed)      metacall-node-python-port-mock-test
         51 - metacall-node-python-port-ruby-test (Failed)      metacall-node-python-port-ruby-test
         52 - metacall-node-python-ruby-test (Failed)           metacall-node-python-ruby-test
         53 - metacall-node-callback-test (Failed)              metacall-node-callback-test
         54 - metacall-node-fail-test (Failed)                  metacall-node-fail-test
         55 - metacall-node-fail-env-var-test (Failed)          metacall-node-fail-env-var-test
         56 - metacall-node-fail-load-leak-test (Failed)        metacall-node-fail-load-leak-test
         57 - metacall-node-typescript-test (Failed)            metacall-node-typescript-test
         58 - metacall-node-python-async-after-destroy-test (Failed) metacall-node-python-async-after-destroy-test
         59 - metacall-node-python-await-test (Failed)          metacall-node-python-await-test
         60 - metacall-node-python-exception-test (Failed)      metacall-node-python-exception-test
         61 - metacall-node-clear-mem-test (Failed)             metacall-node-clear-mem-test
         62 - metacall-node-async-resources-test (Failed)       metacall-node-async-resources-test
         63 - metacall-node-await-chain-test (Failed)           metacall-node-await-chain-test
         64 - metacall-node-exception-test (Failed)             metacall-node-exception-test
         65 - metacall-node-python-deadlock-test (Failed)       metacall-node-python-deadlock-test
         66 - metacall-node-native-code-test (Failed)           metacall-node-native-code-test
         67 - metacall-node-extension-test (Failed)             metacall-node-extension-test
         68 - metacall-node-multithread-deadlock-test (Failed)  metacall-node-multithread-deadlock-test
         70 - metacall-cast-test (Failed)                       metacall-cast-test
         71 - metacall-init-fini-test (Failed)                  metacall-init-fini-test
         72 - metacall-ducktype-test (Failed)                   metacall-ducktype-test
         75 - metacall-depends-test (Failed)                    metacall-depends-test
         79 - metacall-clear-test (Failed)                      metacall-clear-test
         80 - metacall-python-test (Failed)                     metacall-python-test
         81 - metacall-python-object-class-test (Failed)        metacall-python-object-class-test
         82 - metacall-python-gc-test (Failed)                  metacall-python-gc-test
         84 - metacall-python-dict-test (Failed)                metacall-python-dict-test
         85 - metacall-python-pointer-test (Failed)             metacall-python-pointer-test
         86 - metacall-python-reentrant-test (Failed)           metacall-python-reentrant-test
         87 - metacall-python-varargs-test (Failed)             metacall-python-varargs-test
         88 - py-loader-port-test (Failed)                      py-loader-port-test
         89 - metacall-python-port-test (Failed)                metacall-python-port-test
         90 - metacall-python-port-https-test (Failed)          metacall-python-port-https-test
         91 - metacall-python-port-callback-test (Failed)       metacall-python-port-callback-test
         92 - metacall-python-port-pointer-test (Failed)        metacall-python-port-pointer-test
         93 - metacall-python-port-import-test (Failed)         metacall-python-port-import-test
         94 - metacall-python-callback-test (Failed)            metacall-python-callback-test
         95 - metacall-python-fail-test (Failed)                metacall-python-fail-test
         96 - metacall-python-relative-path-test (Failed)       metacall-python-relative-path-test
         97 - metacall-python-without-functions-test (Failed)   metacall-python-without-functions-test
         98 - metacall-python-builtins-test (Failed)            metacall-python-builtins-test
         99 - metacall-python-async-test (Failed)
        100 - metacall-python-exception-test (Failed)           metacall-python-exception-test
        101 - metacall-map-test (Failed)                        metacall-map-test
        102 - metacall-map-await-test (Failed)                  metacall-map-await-test
        103 - metacall-initialize-test (Failed)                 metacall-initialize-test
        104 - metacall-initialize-ex-test (Failed)              metacall-initialize-ex-test
        105 - metacall-reinitialize-test (Failed)               metacall-reinitialize-test
        106 - metacall-initialize-destroy-multiple-test (Failed) metacall-initialize-destroy-multiple-test
        107 - metacall-initialize-destroy-multiple-node-test (Failed) metacall-initialize-destroy-multiple-node-test
        108 - metacall-reload-functions-test (Failed)           metacall-reload-functions-test
        109 - metacall-invalid-loader-test (Failed)             metacall-invalid-loader-test
        110 - metacall-fork-test (Failed)                       metacall-fork-test
        111 - metacall-return-monad-test (Failed)               metacall-return-monad-test
        112 - metacall-callback-complex-test (Failed)           metacall-callback-complex-test
        113 - metacall-ruby-fail-test (Failed)                  metacall-ruby-fail-test
        114 - metacall-ruby-fail-empty-test (Failed)            metacall-ruby-fail-empty-test
        115 - metacall-ruby-object-class-test (Failed)          metacall-ruby-object-class-test
        116 - metacall-ruby-parser-integration-test (Failed)    metacall-ruby-parser-integration-test
        117 - metacall-function-test (Failed)                   metacall-function-test
        118 - metacall-cobol-test (Failed)                      metacall-cobol-test
        119 - metacall-file-test (Failed)                       metacall-file-test
        120 - metacall-file-fail-test (Failed)                  metacall-file-fail-test
        121 - metacall-file-glob-test (Failed)                  metacall-file-glob-test
        122 - metacall-typescript-test (Failed)                 metacall-typescript-test
        123 - metacall-typescript-node-test (Failed)            metacall-typescript-node-test
        124 - metacall-typescript-call-map-test (Failed)        metacall-typescript-call-map-test
        125 - metacall-typescript-tsx-test (Failed)             metacall-typescript-tsx-test
        126 - metacall-typescript-tsx-loop-fail-test (Failed)   metacall-typescript-tsx-loop-fail-test
        127 - metacall-typescript-require-test (Failed)         metacall-typescript-require-test
        128 - metacall-typescript-jsx-default-test (Failed)     metacall-typescript-jsx-default-test
        129 - metacall-rpc-test (Failed)                        metacall-rpc-test
        131 - metacall-ruby-test (Failed)                       metacall-ruby-test
        134 - metacall-c-test (Failed)                          metacall-c-test
        135 - metacall-c-lib-test (Failed)                      metacall-c-lib-test
        139 - metacall-ext-test (Failed)                        metacall-ext-test
        140 - metacall-plugin-extension-test (Failed)           metacall-plugin-extension-test
        141 - metacall-plugin-extension-local-test (Failed)     metacall-plugin-extension-local-test
        142 - metacall-backtrace-plugin-test (Failed)           MEMCHECK_IGNORE metacall-backtrace-plugin-test
        147 - metacall-node-call-bench (SEGFAULT)               metacall-node-call-bench
        148 - metacallcli (Failed)                              metacallcli
        150 - metacallcli-node (Failed)                         metacallcli-node
        151 - metacallcli-node-port-py (Failed)                 metacallcli-node-port-py
        153 - metacallcli-node-null (Failed)                    metacallcli-node-null
        154 - metacallcli-node-null-empty (Failed)              metacallcli-node-null-empty
        155 - metacallcli-node-null-undefined (Failed)          metacallcli-node-null-undefined
        156 - metacallcli-py-port (Failed)                      metacallcli-py-port
        157 - metacallcli-py-port-rb (Failed)                   metacallcli-py-port-rb
        158 - metacallcli-file (Failed)                         metacallcli-file
        159 - metacallcli-file-fail (SEGFAULT)                  metacallcli-file-fail
        160 - metacallcli-py-naming (SEGFAULT)                  metacallcli-py-naming
        161 - metacallcli-py-argv (SEGFAULT)                    metacallcli-py-argv
        162 - metacallcli-py-main (SEGFAULT)                    metacallcli-py-main
        163 - metacallcli-py-exception (Failed)                 metacallcli-py-exception
        164 - metacallcli-rb-simplest (SEGFAULT)                metacallcli-rb-simplest
        165 - metacallcli-ts (Failed)                           metacallcli-ts
        166 - metacallcli-tsx-templating (Failed)               metacallcli-tsx-templating
        167 - metacallcli-tsx-loop-fail (SEGFAULT)              metacallcli-tsx-loop-fail
        168 - metacallcli-py-tsx (Failed)                       metacallcli-py-tsx
The command '/bin/sh -c cd $METACALL_PATH/build         && $METACALL_PATH/tools/metacall-build.sh ${METACALL_BUILD_TYPE} ${METACALL_BUILD_OPTIONS}' returned a non-zero code: 8

Built MetaCall with ASAN enabled inside Docker (.docker-compose.sh test-address-sanitizer), which compiles everything with -fsanitizer=address and runs the full test suite. ASAN instruments every memory allocation at runtime and reports leaks at process exit. metacall-cs-test — the test that loads and executes C# scripts through the cs_loader — passed with no leak report, confirming the 53 MB leak from the original issue is gone.

@viferga
Copy link
Member

viferga commented Mar 5, 2026

Here is the full review: 5a58da1

I have also done a long TODO in cmake scripts related to C#: 56c5223

I had to extend it and complete things that were remaining. If you have doubts feel free to ask, I am closing the PR.

@viferga viferga closed this Mar 5, 2026
@viferga
Copy link
Member

viferga commented Mar 5, 2026

@ROKUMATE I did another improvement: 5d57bb4

@ROKUMATE
Copy link
Contributor Author

ROKUMATE commented Mar 5, 2026

looking into it 👍🏼

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

C# (7.0) Leak with Address Sanitizer when it fails to load a script

2 participants