Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Python 3.12 support replace imp with importlib #1

Closed
Qubitium opened this issue Feb 14, 2024 · 3 comments
Closed

Python 3.12 support replace imp with importlib #1

Qubitium opened this issue Feb 14, 2024 · 3 comments

Comments

@Qubitium
Copy link

Python 3.12 no longer support the imp module (fully deprecated) with note to use importlib as replacement.

Please support python 3.12 by migrating from imp code to importlib. Thanks.

@navytux
Copy link
Owner

navytux commented Feb 15, 2024

Hello @Qubitium. Thanks for bringing this up.

Please find the merge-request that adds py3.12 support at https://lab.nexedi.com/nexedi/pygolang/-/merge_requests/23.

Does it work for you?

Kirill

@Qubitium
Copy link
Author

Compilation work and I believe there are no issues. Thank you! But unfortunately we are unable to test more as we found even more issues with 3.12 and pkgs such as torch 2.2. So we are sticking with 3.11 for now.

navytux added a commit that referenced this issue Feb 17, 2024
@Qubitium notes (#1):

    Python 3.12 no longer support the imp module (fully deprecated) with note to use importlib as replacement.

    Please support python 3.12 by migrating from imp code to importlib. Thanks.

and indeed, even trying to build pygolang fails on py3.12:

    (py312.venv) kirr@deca:~/src/tools/go/pygolang-master$ python setup.py build_ext -i
    Traceback (most recent call last):
      File "/home/kirr/src/tools/go/pygolang-master/setup.py", line 40, in <module>
        exec(readfile('trun'), trun)
      File "<string>", line 41, in <module>
    ModuleNotFoundError: No module named 'imp'

-> Rework the code to use importlib instead, but keep using imp on py2
where there is practically no importlib functionality.

/reported-by @Qubitium (github)
/reviewed-by @jerome
/reviewed-on https://lab.nexedi.com/nexedi/pygolang/-/merge_requests/23
@navytux
Copy link
Owner

navytux commented Feb 17, 2024

@Qubitium, thanks for feedback and you are welcome.

Good to hear that the fix works on your side, so I've merged it to master (68f384a9 + related commits) . I see about other blockers and that you are on 3.11 for now. Thanks, once again, for reporting this issue about pygolang.

Kirill

@navytux navytux closed this as completed Feb 17, 2024
navytux added a commit that referenced this issue Apr 19, 2024
Background: in 2019 in 4dc1a7f0 (tox += ThreadSanitizer, AddressSanitizer,
Python debug builds) I've added ThreadSanitizer and AddressSanitizer to our
test build matrix. That was done in order to help catching concurrency issues
while doing quality assurance and it indeed worked well(*). However AddressSanitizer
was added with disabled memory leak detection, because at that time there were
tons of various allocations done by Python itself, that were not released on
Python shutdown. So leak reporting pass was disabled to avoid huge non-pygolang
related printouts.

5 years later Pygolang is used by various projects, including in XLTE, where, in
particular, it is used to organize 100Hz polling of Amarisoft eNodeB service to
retrieve information about flows on Data Radio Bearers:

https://lab.nexedi.com/kirr/xlte/-/commit/2a016d48
https://lab.nexedi.com/kirr/xlte/-/blob/8e606c64/amari/drb.py

And everything works relatively well except that recently Joanne approached me
with reports that xamari program, that does the polling, is leaking memory.

During investigation I could manually find at least two causes of the leakage,
and, while working on a fix, discovered third type of leak. Since all those
leaks happen inside Pygolang and at, or around, C level - most of the
time not visible through python objects and so not discoverable via e.g
objgraph, it raises the need to have robust quality assurance procedures
built into maintenance process to cover not only concurrency and memory
safety issues, but also to reliably detect low-level memory leaks.

So before we start fixing any of the leakages, let's activate LeakSanitizer
(https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer) to be
present during tox runs, so that whenever we run something via ASAN in the end
tested process is checked for whether anything was leaked and if yes, which
codepath was used to allocate leaked memory.

Initially I though that it would be hard to have distilled reports, the ones
without much of added noise due to leaks on python side, but it turns out that
starting from py3.11 cpython codebase was improved to release on interpreter
shutdown most of what was allocated, and so with modest suppression rules we
can distill LeakSanitizer output to come with the issues that are relevant to
pygolang itself.

That builds the foundation for making sure there are no memory leaks done by
pygolang in the follow-up patches. The next patch will fix chan leakage in
pychan_from_raw, and there will be more fixes to come later.

For now ASAN builds become broken, but that is good that we can see the issues.
Please see the appendix for current LeakSanitizer output.

/cc ORS team (@jhuge, @lu.xu, @tomo, @xavier_thompson, @Daetalus)
/reviewed-by @jerome
/reviewed-on https://lab.nexedi.com/nexedi/pygolang/-/merge_requests/24

(*) at that time, besides discovering longstanding race-condition in Python itself
(https://bugs.python.org/issue38106, https://github.com/python/cpython/pull/16047),
several concurrency issues were found in pygolang codebase as well:

https://lab.nexedi.com/nexedi/pygolang/commit/dcf4ebd1
https://lab.nexedi.com/nexedi/pygolang/commit/65c43848
https://lab.nexedi.com/nexedi/pygolang/commit/5aa1e899
https://lab.nexedi.com/nexedi/pygolang/commit/fd2a6fab

--------

Appendix. List of errors currently emitted by LeakSanitizer when running Pygolang tests

```
==2061372==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 241136 byte(s) in 28 object(s) allocated from:
    #0 0x7f27922f3bd7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x555687a6a9d2 in PyMem_RawMalloc Objects/obmalloc.c:662
    #2 0x555687a6a9d2 in _PyObject_Malloc Objects/obmalloc.c:1569
    #3 0x555687a649e3 in _PyObject_NewVar Objects/object.c:332
    #4 0x555687a0c16b in _PyCode_New Objects/codeobject.c:582
    #5 0x555687b12f84 in makecode Python/assemble.c:574
    #6 0x555687b12f84 in _PyAssemble_MakeCodeObject Python/assemble.c:598
    #7 0x555687b2bdbe in optimize_and_assemble_code_unit Python/compile.c:7707
    #8 0x555687b2bdbe in optimize_and_assemble Python/compile.c:7734
    #9 0x555687b3b1a8 in compiler_function_body Python/compile.c:2247
    #10 0x555687b3b1a8 in compiler_function Python/compile.c:2356
    #11 0x555687b3b787 in compiler_body Python/compile.c:1703
    #12 0x555687b3b917 in compiler_codegen Python/compile.c:1719
    #13 0x555687b3c5c3 in compiler_mod Python/compile.c:1747
    #14 0x555687b3c5c3 in _PyAST_Compile Python/compile.c:584
    #15 0x555687b1f9a0 in builtin_compile_impl Python/bltinmodule.c:820
    #16 0x555687b1f9a0 in builtin_compile Python/clinic/bltinmodule.c.h:383
    #17 0x5556879a5949 in _PyEval_EvalFrameDefault Python/bytecodes.c:2966
    #18 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #19 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #20 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #21 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #22 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #23 0x555687a22c14 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #24 0x555687a22c14 in gen_send_ex2 Objects/genobject.c:230
    #25 0x555687a22c14 in gen_iternext Objects/genobject.c:604
    #26 0x555687a37fd0 in list_extend Objects/listobject.c:944
    #27 0x5556879a3a9a in _PyEval_EvalFrameDefault Python/bytecodes.c:3085
    #28 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #29 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #30 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #31 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #32 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #33 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #34 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #35 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #36 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #37 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #38 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #39 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #40 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #41 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #42 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #43 0x555687a613ae in cfunction_vectorcall_FASTCALL_KEYWORDS Objects/methodobject.c:438
    #44 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #45 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #46 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #47 0x555687ba84fa in pymain_run_module Modules/main.c:300
    #48 0x555687ba8cd9 in pymain_run_python Modules/main.c:623
    #49 0x555687ba96f9 in Py_RunMain Modules/main.c:709
    #50 0x555687ba96f9 in pymain_main Modules/main.c:739
    #51 0x555687ba96f9 in Py_BytesMain Modules/main.c:763
    #52 0x7f2791c46249 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #53 0x7f2791c46304 in __libc_start_main_impl ../csu/libc-start.c:360
    #54 0x5556879aa030 in _start (/home/kirr/local/py3.12/bin/python3.12+0x10c030) (BuildId: 90994913e85aac5c35e9f04b53a6eeee5a04786d)

Direct leak of 235267 byte(s) in 25 object(s) allocated from:
    #0 0x7f27922f3bd7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x555687a6a9d2 in PyMem_RawMalloc Objects/obmalloc.c:662
    #2 0x555687a6a9d2 in _PyObject_Malloc Objects/obmalloc.c:1569
    #3 0x5556879faf23 in _PyBytes_FromSize Objects/bytesobject.c:102
    #4 0x5556879faf23 in _PyBytes_FromSize Objects/bytesobject.c:83
    #5 0x5556879faf23 in PyBytes_FromStringAndSize Objects/bytesobject.c:134
    #6 0x555687a0e210 in _PyCode_GetCode Objects/codeobject.c:1535
    #7 0x555687b70339 in w_complex_object Python/marshal.c:554
    #8 0x555687b70339 in w_object Python/marshal.c:375
    #9 0x555687b6fde4 in w_complex_object Python/marshal.c:479
    #10 0x555687b6fde4 in w_object Python/marshal.c:375
    #11 0x555687b703b5 in w_complex_object Python/marshal.c:566
    #12 0x555687b703b5 in w_object Python/marshal.c:375
    #13 0x555687b6f470 in PyMarshal_WriteObjectToString Python/marshal.c:1669
    #14 0x5556879a57c9 in _PyEval_EvalFrameDefault Python/bytecodes.c:2929
    #15 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #16 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #17 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #18 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #19 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #20 0x555687a22c14 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #21 0x555687a22c14 in gen_send_ex2 Objects/genobject.c:230
    #22 0x555687a22c14 in gen_iternext Objects/genobject.c:604
    #23 0x555687a37fd0 in list_extend Objects/listobject.c:944
    #24 0x5556879a3a9a in _PyEval_EvalFrameDefault Python/bytecodes.c:3085
    #25 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #26 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #27 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #28 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #29 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #30 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #31 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #32 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #33 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #34 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #35 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #36 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #37 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #38 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #39 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #40 0x555687a613ae in cfunction_vectorcall_FASTCALL_KEYWORDS Objects/methodobject.c:438
    #41 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #42 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #43 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #44 0x555687ba84fa in pymain_run_module Modules/main.c:300
    #45 0x555687ba8cd9 in pymain_run_python Modules/main.c:623
    #46 0x555687ba96f9 in Py_RunMain Modules/main.c:709
    #47 0x555687ba96f9 in pymain_main Modules/main.c:739
    #48 0x555687ba96f9 in Py_BytesMain Modules/main.c:763
    #49 0x7f2791c46249 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #50 0x7f2791c46304 in __libc_start_main_impl ../csu/libc-start.c:360
    #51 0x5556879aa030 in _start (/home/kirr/local/py3.12/bin/python3.12+0x10c030) (BuildId: 90994913e85aac5c35e9f04b53a6eeee5a04786d)

Direct leak of 22656 byte(s) in 9 object(s) allocated from:
    #0 0x7f27922f3bd7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x555687a6a9d2 in PyMem_RawMalloc Objects/obmalloc.c:662
    #2 0x555687a6a9d2 in _PyObject_Malloc Objects/obmalloc.c:1569
    #3 0x555687a649e3 in _PyObject_NewVar Objects/object.c:332
    #4 0x555687a0c16b in _PyCode_New Objects/codeobject.c:582
    #5 0x555687b12f84 in makecode Python/assemble.c:574
    #6 0x555687b12f84 in _PyAssemble_MakeCodeObject Python/assemble.c:598
    #7 0x555687b2bdbe in optimize_and_assemble_code_unit Python/compile.c:7707
    #8 0x555687b2bdbe in optimize_and_assemble Python/compile.c:7734
    #9 0x555687b3b1a8 in compiler_function_body Python/compile.c:2247
    #10 0x555687b3b1a8 in compiler_function Python/compile.c:2356
    #11 0x555687b3b787 in compiler_body Python/compile.c:1703
    #12 0x555687b3b917 in compiler_codegen Python/compile.c:1719
    #13 0x555687b3c5c3 in compiler_mod Python/compile.c:1747
    #14 0x555687b3c5c3 in _PyAST_Compile Python/compile.c:584
    #15 0x555687b1f9a0 in builtin_compile_impl Python/bltinmodule.c:820
    #16 0x555687b1f9a0 in builtin_compile Python/clinic/bltinmodule.c.h:383
    #17 0x5556879a5949 in _PyEval_EvalFrameDefault Python/bytecodes.c:2966
    #18 0x555687a061f5 in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #19 0x555687a061f5 in PyObject_CallOneArg Objects/call.c:401
    #20 0x555687a675f1 in _PyObject_GenericGetAttrWithDict Objects/object.c:1430
    #21 0x555687a6728d in PyObject_GetAttr Objects/object.c:1044
    #22 0x55568799fd39 in _PyEval_EvalFrameDefault Python/bytecodes.c:1794
    #23 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #24 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #25 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #26 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #27 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #28 0x555687a22c14 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #29 0x555687a22c14 in gen_send_ex2 Objects/genobject.c:230
    #30 0x555687a22c14 in gen_iternext Objects/genobject.c:604
    #31 0x555687a37fa5 in list_extend Objects/listobject.c:944
    #32 0x555687a14520 in method_vectorcall_O Objects/descrobject.c:482
    #33 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #34 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #35 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #36 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #37 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #38 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #39 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #40 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #41 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #42 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #43 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #44 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #45 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #46 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #47 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #48 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #49 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #50 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #51 0x555687a613ae in cfunction_vectorcall_FASTCALL_KEYWORDS Objects/methodobject.c:438
    #52 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #53 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #54 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #55 0x555687ba84fa in pymain_run_module Modules/main.c:300
    #56 0x555687ba8cd9 in pymain_run_python Modules/main.c:623
    #57 0x555687ba96f9 in Py_RunMain Modules/main.c:709
    #58 0x555687ba96f9 in pymain_main Modules/main.c:739
    #59 0x555687ba96f9 in Py_BytesMain Modules/main.c:763
    #60 0x7f2791c46249 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #61 0x7f2791c46304 in __libc_start_main_impl ../csu/libc-start.c:360
    #62 0x5556879aa030 in _start (/home/kirr/local/py3.12/bin/python3.12+0x10c030) (BuildId: 90994913e85aac5c35e9f04b53a6eeee5a04786d)

Direct leak of 21199 byte(s) in 9 object(s) allocated from:
    #0 0x7f27922f3bd7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x555687a6a9d2 in PyMem_RawMalloc Objects/obmalloc.c:662
    #2 0x555687a6a9d2 in _PyObject_Malloc Objects/obmalloc.c:1569
    #3 0x5556879faf23 in _PyBytes_FromSize Objects/bytesobject.c:102
    #4 0x5556879faf23 in _PyBytes_FromSize Objects/bytesobject.c:83
    #5 0x5556879faf23 in PyBytes_FromStringAndSize Objects/bytesobject.c:134
    #6 0x555687a0e210 in _PyCode_GetCode Objects/codeobject.c:1535
    #7 0x555687b70339 in w_complex_object Python/marshal.c:554
    #8 0x555687b70339 in w_object Python/marshal.c:375
    #9 0x555687b6fde4 in w_complex_object Python/marshal.c:479
    #10 0x555687b6fde4 in w_object Python/marshal.c:375
    #11 0x555687b703b5 in w_complex_object Python/marshal.c:566
    #12 0x555687b703b5 in w_object Python/marshal.c:375
    #13 0x555687b6f470 in PyMarshal_WriteObjectToString Python/marshal.c:1669
    #14 0x5556879a57c9 in _PyEval_EvalFrameDefault Python/bytecodes.c:2929
    #15 0x555687a061f5 in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #16 0x555687a061f5 in PyObject_CallOneArg Objects/call.c:401
    #17 0x555687a675f1 in _PyObject_GenericGetAttrWithDict Objects/object.c:1430
    #18 0x555687a6728d in PyObject_GetAttr Objects/object.c:1044
    #19 0x55568799fd39 in _PyEval_EvalFrameDefault Python/bytecodes.c:1794
    #20 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #21 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #22 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #23 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #24 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #25 0x555687a22c14 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #26 0x555687a22c14 in gen_send_ex2 Objects/genobject.c:230
    #27 0x555687a22c14 in gen_iternext Objects/genobject.c:604
    #28 0x555687a37fa5 in list_extend Objects/listobject.c:944
    #29 0x555687a14520 in method_vectorcall_O Objects/descrobject.c:482
    #30 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #31 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #32 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #33 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #34 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #35 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #36 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #37 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #38 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #39 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #40 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #41 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #42 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #43 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #44 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #45 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #46 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #47 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #48 0x555687a613ae in cfunction_vectorcall_FASTCALL_KEYWORDS Objects/methodobject.c:438
    #49 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #50 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #51 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #52 0x555687ba84fa in pymain_run_module Modules/main.c:300
    #53 0x555687ba8cd9 in pymain_run_python Modules/main.c:623
    #54 0x555687ba96f9 in Py_RunMain Modules/main.c:709
    #55 0x555687ba96f9 in pymain_main Modules/main.c:739
    #56 0x555687ba96f9 in Py_BytesMain Modules/main.c:763
    #57 0x7f2791c46249 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #58 0x7f2791c46304 in __libc_start_main_impl ../csu/libc-start.c:360
    #59 0x5556879aa030 in _start (/home/kirr/local/py3.12/bin/python3.12+0x10c030) (BuildId: 90994913e85aac5c35e9f04b53a6eeee5a04786d)

Direct leak of 8192 byte(s) in 1 object(s) allocated from:
    #0 0x7f27922f3bd7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x555687a6a9d2 in PyMem_RawMalloc Objects/obmalloc.c:662
    #2 0x555687a6a9d2 in _PyObject_Malloc Objects/obmalloc.c:1569
    #3 0x555687a70058 in set_table_resize Objects/setobject.c:274
    #4 0x555687a708c1 in set_add_key Objects/setobject.c:354
    #5 0x555687a708c1 in set_update_internal Objects/setobject.c:913
    #6 0x555687a708c1 in set_update_internal Objects/setobject.c:878
    #7 0x555687a70c4e in set_update Objects/setobject.c:933
    #8 0x555687a13046 in method_vectorcall_VARARGS Objects/descrobject.c:331
    #9 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #10 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #11 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #12 0x555687a23bc4 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #13 0x555687a23bc4 in gen_send_ex2 Objects/genobject.c:230
    #14 0x555687a23bc4 in gen_send_ex Objects/genobject.c:274
    #15 0x555687a23bc4 in gen_send Objects/genobject.c:297
    #16 0x5556879a3a9a in _PyEval_EvalFrameDefault Python/bytecodes.c:3085
    #17 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #18 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #19 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #20 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #21 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #22 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #23 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #24 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #25 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #26 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #27 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #28 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #29 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #30 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #31 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #32 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #33 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #34 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #35 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #36 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #37 0x555687a613ae in cfunction_vectorcall_FASTCALL_KEYWORDS Objects/methodobject.c:438
    #38 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #39 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #40 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #41 0x555687ba84fa in pymain_run_module Modules/main.c:300
    #42 0x555687ba8cd9 in pymain_run_python Modules/main.c:623
    #43 0x555687ba96f9 in Py_RunMain Modules/main.c:709
    #44 0x555687ba96f9 in pymain_main Modules/main.c:739
    #45 0x555687ba96f9 in Py_BytesMain Modules/main.c:763
    #46 0x7f2791c46249 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #47 0x7f2791c46304 in __libc_start_main_impl ../csu/libc-start.c:360
    #48 0x5556879aa030 in _start (/home/kirr/local/py3.12/bin/python3.12+0x10c030) (BuildId: 90994913e85aac5c35e9f04b53a6eeee5a04786d)

Direct leak of 4592 byte(s) in 5 object(s) allocated from:
    #0 0x7f27922f3bd7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x555687a6a9d2 in PyMem_RawMalloc Objects/obmalloc.c:662
    #2 0x555687a6a9d2 in _PyObject_Malloc Objects/obmalloc.c:1569
    #3 0x555687a4d4e8 in new_keys_object Objects/dictobject.c:641
    #4 0x555687a4d4e8 in dictresize Objects/dictobject.c:1449
    #5 0x555687a53277 in insertion_resize Objects/dictobject.c:1194
    #6 0x555687a53277 in insertdict Objects/dictobject.c:1261
    #7 0x5556879a7314 in _PyEval_EvalFrameDefault Python/bytecodes.c:1023
    #8 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #9 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #10 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #11 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #12 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #13 0x5556879a5949 in _PyEval_EvalFrameDefault Python/bytecodes.c:2966
    #14 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #15 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #16 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #17 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #18 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #19 0x555687a22c14 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #20 0x555687a22c14 in gen_send_ex2 Objects/genobject.c:230
    #21 0x555687a22c14 in gen_iternext Objects/genobject.c:604
    #22 0x555687a37fd0 in list_extend Objects/listobject.c:944
    #23 0x5556879a3a9a in _PyEval_EvalFrameDefault Python/bytecodes.c:3085
    #24 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #25 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #26 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #27 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #28 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #29 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #30 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #31 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #32 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #33 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #34 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #35 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #36 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #37 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #38 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #39 0x555687a613ae in cfunction_vectorcall_FASTCALL_KEYWORDS Objects/methodobject.c:438
    #40 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #41 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #42 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #43 0x555687ba84fa in pymain_run_module Modules/main.c:300
    #44 0x555687ba8cd9 in pymain_run_python Modules/main.c:623
    #45 0x555687ba96f9 in Py_RunMain Modules/main.c:709
    #46 0x555687ba96f9 in pymain_main Modules/main.c:739
    #47 0x555687ba96f9 in Py_BytesMain Modules/main.c:763
    #48 0x7f2791c46249 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #49 0x7f2791c46304 in __libc_start_main_impl ../csu/libc-start.c:360
    #50 0x5556879aa030 in _start (/home/kirr/local/py3.12/bin/python3.12+0x10c030) (BuildId: 90994913e85aac5c35e9f04b53a6eeee5a04786d)

Direct leak of 4032 byte(s) in 2 object(s) allocated from:
    #0 0x7f27922f3bd7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x555687a6a9d2 in PyMem_RawMalloc Objects/obmalloc.c:662
    #2 0x555687a6a9d2 in _PyObject_Malloc Objects/obmalloc.c:1569
    #3 0x555687a4d4e8 in new_keys_object Objects/dictobject.c:641
    #4 0x555687a4d4e8 in dictresize Objects/dictobject.c:1449
    #5 0x555687a53277 in insertion_resize Objects/dictobject.c:1194
    #6 0x555687a53277 in insertdict Objects/dictobject.c:1261
    #7 0x5556879a4de2 in _PyEval_EvalFrameDefault Python/bytecodes.c:579
    #8 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #9 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #10 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #11 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #12 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #13 0x555687a613ae in cfunction_vectorcall_FASTCALL_KEYWORDS Objects/methodobject.c:438
    #14 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #15 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #16 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #17 0x555687ba84fa in pymain_run_module Modules/main.c:300
    #18 0x555687ba8cd9 in pymain_run_python Modules/main.c:623
    #19 0x555687ba96f9 in Py_RunMain Modules/main.c:709
    #20 0x555687ba96f9 in pymain_main Modules/main.c:739
    #21 0x555687ba96f9 in Py_BytesMain Modules/main.c:763
    #22 0x7f2791c46249 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #23 0x7f2791c46304 in __libc_start_main_impl ../csu/libc-start.c:360
    #24 0x5556879aa030 in _start (/home/kirr/local/py3.12/bin/python3.12+0x10c030) (BuildId: 90994913e85aac5c35e9f04b53a6eeee5a04786d)

Direct leak of 3264 byte(s) in 1 object(s) allocated from:
    #0 0x7f27922f3bd7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x555687a6a9d2 in PyMem_RawMalloc Objects/obmalloc.c:662
    #2 0x555687a6a9d2 in _PyObject_Malloc Objects/obmalloc.c:1569
    #3 0x555687a4d4e8 in new_keys_object Objects/dictobject.c:641
    #4 0x555687a4d4e8 in dictresize Objects/dictobject.c:1449
    #5 0x555687a53277 in insertion_resize Objects/dictobject.c:1194
    #6 0x555687a53277 in insertdict Objects/dictobject.c:1261
    #7 0x5556879a4de2 in _PyEval_EvalFrameDefault Python/bytecodes.c:579
    #8 0x555687a09b17 in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #9 0x555687a09b17 in method_vectorcall Objects/classobject.c:61
    #10 0x555687a07f9b in PyObject_Call (/home/kirr/local/py3.12/bin/python3.12+0x169f9b) (BuildId: 90994913e85aac5c35e9f04b53a6eeee5a04786d)
    #11 0x55568799e2ed in _PyEval_EvalFrameDefault Python/bytecodes.c:3254
    #12 0x555687a09a90 in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #13 0x555687a09a90 in method_vectorcall Objects/classobject.c:91
    #14 0x55568799e2ed in _PyEval_EvalFrameDefault Python/bytecodes.c:3254
    #15 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #16 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #17 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #18 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #19 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #20 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #21 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #22 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #23 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #24 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #25 0x555687a613ae in cfunction_vectorcall_FASTCALL_KEYWORDS Objects/methodobject.c:438
    #26 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #27 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #28 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #29 0x555687ba84fa in pymain_run_module Modules/main.c:300
    #30 0x555687ba8cd9 in pymain_run_python Modules/main.c:623
    #31 0x555687ba96f9 in Py_RunMain Modules/main.c:709
    #32 0x555687ba96f9 in pymain_main Modules/main.c:739
    #33 0x555687ba96f9 in Py_BytesMain Modules/main.c:763
    #34 0x7f2791c46249 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #35 0x7f2791c46304 in __libc_start_main_impl ../csu/libc-start.c:360
    #36 0x5556879aa030 in _start (/home/kirr/local/py3.12/bin/python3.12+0x10c030) (BuildId: 90994913e85aac5c35e9f04b53a6eeee5a04786d)

Direct leak of 3168 byte(s) in 2 object(s) allocated from:
    #0 0x7f27922f2ad8 in realloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:85
    #1 0x555687a37ebc in list_resize Objects/listobject.c:82
    #2 0x555687a37ebc in list_extend Objects/listobject.c:892
    #3 0x5556879a3a9a in _PyEval_EvalFrameDefault Python/bytecodes.c:3085
    #4 0x555687a09a90 in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #5 0x555687a09a90 in method_vectorcall Objects/classobject.c:91
    #6 0x55568799e2ed in _PyEval_EvalFrameDefault Python/bytecodes.c:3254
    #7 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #8 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #9 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #10 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #11 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #12 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #13 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #14 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #15 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #16 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #17 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #18 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #19 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #20 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #21 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #22 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #23 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #24 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #25 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #26 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #27 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #28 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #29 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #30 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #31 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #32 0x555687a613ae in cfunction_vectorcall_FASTCALL_KEYWORDS Objects/methodobject.c:438
    #33 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #34 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #35 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #36 0x555687ba84fa in pymain_run_module Modules/main.c:300
    #37 0x555687ba8cd9 in pymain_run_python Modules/main.c:623
    #38 0x555687ba96f9 in Py_RunMain Modules/main.c:709
    #39 0x555687ba96f9 in pymain_main Modules/main.c:739
    #40 0x555687ba96f9 in Py_BytesMain Modules/main.c:763
    #41 0x7f2791c46249 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #42 0x7f2791c46304 in __libc_start_main_impl ../csu/libc-start.c:360
    #43 0x5556879aa030 in _start (/home/kirr/local/py3.12/bin/python3.12+0x10c030) (BuildId: 90994913e85aac5c35e9f04b53a6eeee5a04786d)

Direct leak of 3024 byte(s) in 2 object(s) allocated from:
    #0 0x7f27922f3bd7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x555687a6a9d2 in PyMem_RawMalloc Objects/obmalloc.c:662
    #2 0x555687a6a9d2 in _PyObject_Malloc Objects/obmalloc.c:1569
    #3 0x555687a649e3 in _PyObject_NewVar Objects/object.c:332
    #4 0x555687a0c16b in _PyCode_New Objects/codeobject.c:582
    #5 0x555687b12f84 in makecode Python/assemble.c:574
    #6 0x555687b12f84 in _PyAssemble_MakeCodeObject Python/assemble.c:598
    #7 0x555687b2bdbe in optimize_and_assemble_code_unit Python/compile.c:7707
    #8 0x555687b2bdbe in optimize_and_assemble Python/compile.c:7734
    #9 0x555687b3b1a8 in compiler_function_body Python/compile.c:2247
    #10 0x555687b3b1a8 in compiler_function Python/compile.c:2356
    #11 0x555687b3b787 in compiler_body Python/compile.c:1703
    #12 0x555687b3b917 in compiler_codegen Python/compile.c:1719
    #13 0x555687b3c5c3 in compiler_mod Python/compile.c:1747
    #14 0x555687b3c5c3 in _PyAST_Compile Python/compile.c:584
    #15 0x555687b1f9a0 in builtin_compile_impl Python/bltinmodule.c:820
    #16 0x555687b1f9a0 in builtin_compile Python/clinic/bltinmodule.c.h:383
    #17 0x5556879a5949 in _PyEval_EvalFrameDefault Python/bytecodes.c:2966
    #18 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #19 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #20 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #21 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #22 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #23 0x555687a22c14 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #24 0x555687a22c14 in gen_send_ex2 Objects/genobject.c:230
    #25 0x555687a22c14 in gen_iternext Objects/genobject.c:604
    #26 0x555687a37fa5 in list_extend Objects/listobject.c:944
    #27 0x5556879a3a9a in _PyEval_EvalFrameDefault Python/bytecodes.c:3085
    #28 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #29 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #30 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #31 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #32 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #33 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #34 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #35 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #36 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #37 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #38 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #39 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #40 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #41 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #42 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #43 0x555687a613ae in cfunction_vectorcall_FASTCALL_KEYWORDS Objects/methodobject.c:438
    #44 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #45 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #46 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #47 0x555687ba84fa in pymain_run_module Modules/main.c:300
    #48 0x555687ba8cd9 in pymain_run_python Modules/main.c:623
    #49 0x555687ba96f9 in Py_RunMain Modules/main.c:709
    #50 0x555687ba96f9 in pymain_main Modules/main.c:739
    #51 0x555687ba96f9 in Py_BytesMain Modules/main.c:763
    #52 0x7f2791c46249 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #53 0x7f2791c46304 in __libc_start_main_impl ../csu/libc-start.c:360
    #54 0x5556879aa030 in _start (/home/kirr/local/py3.12/bin/python3.12+0x10c030) (BuildId: 90994913e85aac5c35e9f04b53a6eeee5a04786d)

Direct leak of 2702 byte(s) in 2 object(s) allocated from:
    #0 0x7f27922f3bd7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x555687a6a9d2 in PyMem_RawMalloc Objects/obmalloc.c:662
    #2 0x555687a6a9d2 in _PyObject_Malloc Objects/obmalloc.c:1569
    #3 0x5556879faf23 in _PyBytes_FromSize Objects/bytesobject.c:102
    #4 0x5556879faf23 in _PyBytes_FromSize Objects/bytesobject.c:83
    #5 0x5556879faf23 in PyBytes_FromStringAndSize Objects/bytesobject.c:134
    #6 0x555687a0e210 in _PyCode_GetCode Objects/codeobject.c:1535
    #7 0x555687b70339 in w_complex_object Python/marshal.c:554
    #8 0x555687b70339 in w_object Python/marshal.c:375
    #9 0x555687b6fde4 in w_complex_object Python/marshal.c:479
    #10 0x555687b6fde4 in w_object Python/marshal.c:375
    #11 0x555687b703b5 in w_complex_object Python/marshal.c:566
    #12 0x555687b703b5 in w_object Python/marshal.c:375
    #13 0x555687b6f470 in PyMarshal_WriteObjectToString Python/marshal.c:1669
    #14 0x5556879a57c9 in _PyEval_EvalFrameDefault Python/bytecodes.c:2929
    #15 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #16 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #17 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #18 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #19 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #20 0x555687a22c14 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #21 0x555687a22c14 in gen_send_ex2 Objects/genobject.c:230
    #22 0x555687a22c14 in gen_iternext Objects/genobject.c:604
    #23 0x555687a37fa5 in list_extend Objects/listobject.c:944
    #24 0x5556879a3a9a in _PyEval_EvalFrameDefault Python/bytecodes.c:3085
    #25 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #26 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #27 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #28 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #29 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #30 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #31 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #32 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #33 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #34 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #35 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #36 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #37 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #38 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #39 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #40 0x555687a613ae in cfunction_vectorcall_FASTCALL_KEYWORDS Objects/methodobject.c:438
    #41 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #42 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #43 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #44 0x555687ba84fa in pymain_run_module Modules/main.c:300
    #45 0x555687ba8cd9 in pymain_run_python Modules/main.c:623
    #46 0x555687ba96f9 in Py_RunMain Modules/main.c:709
    #47 0x555687ba96f9 in pymain_main Modules/main.c:739
    #48 0x555687ba96f9 in Py_BytesMain Modules/main.c:763
    #49 0x7f2791c46249 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #50 0x7f2791c46304 in __libc_start_main_impl ../csu/libc-start.c:360
    #51 0x5556879aa030 in _start (/home/kirr/local/py3.12/bin/python3.12+0x10c030) (BuildId: 90994913e85aac5c35e9f04b53a6eeee5a04786d)

Direct leak of 2200 byte(s) in 1 object(s) allocated from:
    #0 0x7f27922f3bd7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x555687a6a9d2 in PyMem_RawMalloc Objects/obmalloc.c:662
    #2 0x555687a6a9d2 in _PyObject_Malloc Objects/obmalloc.c:1569
    #3 0x555687a4d4e8 in new_keys_object Objects/dictobject.c:641
    #4 0x555687a4d4e8 in dictresize Objects/dictobject.c:1449
    #5 0x555687a53277 in insertion_resize Objects/dictobject.c:1194
    #6 0x555687a53277 in insertdict Objects/dictobject.c:1261
    #7 0x555687c0ff1e in bounded_lru_cache_wrapper Modules/_functoolsmodule.c:1067
    #8 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #9 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #10 0x555687a061f5 in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #11 0x555687a061f5 in PyObject_CallOneArg Objects/call.c:401
    #12 0x555687a675f1 in _PyObject_GenericGetAttrWithDict Objects/object.c:1430
    #13 0x555687a6728d in PyObject_GetAttr Objects/object.c:1044
    #14 0x55568799fd39 in _PyEval_EvalFrameDefault Python/bytecodes.c:1794
    #15 0x555687a22c14 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #16 0x555687a22c14 in gen_send_ex2 Objects/genobject.c:230
    #17 0x555687a22c14 in gen_iternext Objects/genobject.c:604
    #18 0x555687a37fa5 in list_extend Objects/listobject.c:944
    #19 0x5556879a3a9a in _PyEval_EvalFrameDefault Python/bytecodes.c:3085
    #20 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #21 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #22 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #23 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #24 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #25 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #26 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #27 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #28 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #29 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #30 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #31 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #32 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #33 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #34 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #35 0x555687a613ae in cfunction_vectorcall_FASTCALL_KEYWORDS Objects/methodobject.c:438
    #36 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #37 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #38 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #39 0x555687ba84fa in pymain_run_module Modules/main.c:300
    #40 0x555687ba8cd9 in pymain_run_python Modules/main.c:623
    #41 0x555687ba96f9 in Py_RunMain Modules/main.c:709
    #42 0x555687ba96f9 in pymain_main Modules/main.c:739
    #43 0x555687ba96f9 in Py_BytesMain Modules/main.c:763
    #44 0x7f2791c46249 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #45 0x7f2791c46304 in __libc_start_main_impl ../csu/libc-start.c:360
    #46 0x5556879aa030 in _start (/home/kirr/local/py3.12/bin/python3.12+0x10c030) (BuildId: 90994913e85aac5c35e9f04b53a6eeee5a04786d)

Direct leak of 2048 byte(s) in 1 object(s) allocated from:
    #0 0x7f27922f3bd7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x555687a6a9d2 in PyMem_RawMalloc Objects/obmalloc.c:662
    #2 0x555687a6a9d2 in _PyObject_Malloc Objects/obmalloc.c:1569
    #3 0x555687a70058 in set_table_resize Objects/setobject.c:274
    #4 0x555687a70714 in set_add_key Objects/setobject.c:354
    #5 0x555687a70714 in set_add Objects/setobject.c:1840
    #6 0x5556879a3a9a in _PyEval_EvalFrameDefault Python/bytecodes.c:3085
    #7 0x555687a09a90 in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #8 0x555687a09a90 in method_vectorcall Objects/classobject.c:91
    #9 0x55568799e2ed in _PyEval_EvalFrameDefault Python/bytecodes.c:3254
    #10 0x555687a08293 in _PyObject_FastCallDictTstate Objects/call.c:133
    #11 0x555687a08293 in _PyObject_Call_Prepend Objects/call.c:508
    #12 0x555687a911ac in slot_tp_init Objects/typeobject.c:9014
    #13 0x555687a7e8d6 in type_call Objects/typeobject.c:1673
    #14 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #15 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #16 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #17 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #18 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #19 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #20 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #21 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #22 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #23 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #24 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #25 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #26 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #27 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #28 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #29 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #30 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #31 0x555687a613ae in cfunction_vectorcall_FASTCALL_KEYWORDS Objects/methodobject.c:438
    #32 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #33 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #34 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #35 0x555687ba84fa in pymain_run_module Modules/main.c:300
    #36 0x555687ba8cd9 in pymain_run_python Modules/main.c:623
    #37 0x555687ba96f9 in Py_RunMain Modules/main.c:709
    #38 0x555687ba96f9 in pymain_main Modules/main.c:739
    #39 0x555687ba96f9 in Py_BytesMain Modules/main.c:763
    #40 0x7f2791c46249 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #41 0x7f2791c46304 in __libc_start_main_impl ../csu/libc-start.c:360
    #42 0x5556879aa030 in _start (/home/kirr/local/py3.12/bin/python3.12+0x10c030) (BuildId: 90994913e85aac5c35e9f04b53a6eeee5a04786d)

Direct leak of 1520 byte(s) in 1 object(s) allocated from:
    #0 0x7f27922f3bd7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x555687a6a9d2 in PyMem_RawMalloc Objects/obmalloc.c:662
    #2 0x555687a6a9d2 in _PyObject_Malloc Objects/obmalloc.c:1569
    #3 0x555687a4d4e8 in new_keys_object Objects/dictobject.c:641
    #4 0x555687a4d4e8 in dictresize Objects/dictobject.c:1449
    #5 0x555687a53277 in insertion_resize Objects/dictobject.c:1194
    #6 0x555687a53277 in insertdict Objects/dictobject.c:1261
    #7 0x555687a65e81 in _PyObject_GenericSetAttrWithDict Objects/object.c:1562
    #8 0x555687a65e81 in PyObject_GenericSetAttr Objects/object.c:1619
    #9 0x555687a67094 in PyObject_SetAttr Objects/object.c:1175
    #10 0x555687b1bbe6 in builtin_setattr_impl Python/bltinmodule.c:1547
    #11 0x555687b1bbe6 in builtin_setattr Python/clinic/bltinmodule.c.h:765
    #12 0x5556879a57c9 in _PyEval_EvalFrameDefault Python/bytecodes.c:2929
    #13 0x555687a08293 in _PyObject_FastCallDictTstate Objects/call.c:133
    #14 0x555687a08293 in _PyObject_Call_Prepend Objects/call.c:508
    #15 0x555687a911ac in slot_tp_init Objects/typeobject.c:9014
    #16 0x555687a7e8d6 in type_call Objects/typeobject.c:1673
    #17 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #18 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #19 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #20 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #21 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #22 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #23 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #24 0x555687a613ae in cfunction_vectorcall_FASTCALL_KEYWORDS Objects/methodobject.c:438
    #25 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #26 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #27 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #28 0x555687ba84fa in pymain_run_module Modules/main.c:300
    #29 0x555687ba8cd9 in pymain_run_python Modules/main.c:623
    #30 0x555687ba96f9 in Py_RunMain Modules/main.c:709
    #31 0x555687ba96f9 in pymain_main Modules/main.c:739
    #32 0x555687ba96f9 in Py_BytesMain Modules/main.c:763
    #33 0x7f2791c46249 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #34 0x7f2791c46304 in __libc_start_main_impl ../csu/libc-start.c:360
    #35 0x5556879aa030 in _start (/home/kirr/local/py3.12/bin/python3.12+0x10c030) (BuildId: 90994913e85aac5c35e9f04b53a6eeee5a04786d)

Direct leak of 1520 byte(s) in 1 object(s) allocated from:
    #0 0x7f27922f3bd7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x555687a6a9d2 in PyMem_RawMalloc Objects/obmalloc.c:662
    #2 0x555687a6a9d2 in _PyObject_Malloc Objects/obmalloc.c:1569
    #3 0x555687a4d4e8 in new_keys_object Objects/dictobject.c:641
    #4 0x555687a4d4e8 in dictresize Objects/dictobject.c:1449
    #5 0x555687a53277 in insertion_resize Objects/dictobject.c:1194
    #6 0x555687a53277 in insertdict Objects/dictobject.c:1261
    #7 0x5556879a4de2 in _PyEval_EvalFrameDefault Python/bytecodes.c:579
    #8 0x555687a09a90 in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #9 0x555687a09a90 in method_vectorcall Objects/classobject.c:91
    #10 0x55568799e2ed in _PyEval_EvalFrameDefault Python/bytecodes.c:3254
    #11 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #12 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #13 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #14 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #15 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #16 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #17 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #18 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #19 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #20 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #21 0x555687a613ae in cfunction_vectorcall_FASTCALL_KEYWORDS Objects/methodobject.c:438
    #22 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #23 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #24 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #25 0x555687ba84fa in pymain_run_module Modules/main.c:300
    #26 0x555687ba8cd9 in pymain_run_python Modules/main.c:623
    #27 0x555687ba96f9 in Py_RunMain Modules/main.c:709
    #28 0x555687ba96f9 in pymain_main Modules/main.c:739
    #29 0x555687ba96f9 in Py_BytesMain Modules/main.c:763
    #30 0x7f2791c46249 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #31 0x7f2791c46304 in __libc_start_main_impl ../csu/libc-start.c:360
    #32 0x5556879aa030 in _start (/home/kirr/local/py3.12/bin/python3.12+0x10c030) (BuildId: 90994913e85aac5c35e9f04b53a6eeee5a04786d)

Direct leak of 1520 byte(s) in 1 object(s) allocated from:
    #0 0x7f27922f3bd7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x555687a6a9d2 in PyMem_RawMalloc Objects/obmalloc.c:662
    #2 0x555687a6a9d2 in _PyObject_Malloc Objects/obmalloc.c:1569
    #3 0x555687a4d4e8 in new_keys_object Objects/dictobject.c:641
    #4 0x555687a4d4e8 in dictresize Objects/dictobject.c:1449
    #5 0x555687a53277 in insertion_resize Objects/dictobject.c:1194
    #6 0x555687a53277 in insertdict Objects/dictobject.c:1261
    #7 0x555687a65e81 in _PyObject_GenericSetAttrWithDict Objects/object.c:1562
    #8 0x555687a65e81 in PyObject_GenericSetAttr Objects/object.c:1619
    #9 0x555687a67094 in PyObject_SetAttr Objects/object.c:1175
    #10 0x555687b1bbe6 in builtin_setattr_impl Python/bltinmodule.c:1547
    #11 0x555687b1bbe6 in builtin_setattr Python/clinic/bltinmodule.c.h:765
    #12 0x5556879a57c9 in _PyEval_EvalFrameDefault Python/bytecodes.c:2929
    #13 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #14 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #15 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #16 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #17 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #18 0x555687a613ae in cfunction_vectorcall_FASTCALL_KEYWORDS Objects/methodobject.c:438
    #19 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #20 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #21 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #22 0x555687ba84fa in pymain_run_module Modules/main.c:300
    #23 0x555687ba8cd9 in pymain_run_python Modules/main.c:623
    #24 0x555687ba96f9 in Py_RunMain Modules/main.c:709
    #25 0x555687ba96f9 in pymain_main Modules/main.c:739
    #26 0x555687ba96f9 in Py_BytesMain Modules/main.c:763
    #27 0x7f2791c46249 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #28 0x7f2791c46304 in __libc_start_main_impl ../csu/libc-start.c:360
    #29 0x5556879aa030 in _start (/home/kirr/local/py3.12/bin/python3.12+0x10c030) (BuildId: 90994913e85aac5c35e9f04b53a6eeee5a04786d)

Direct leak of 1520 byte(s) in 1 object(s) allocated from:
    #0 0x7f27922f3bd7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x555687a6a9d2 in PyMem_RawMalloc Objects/obmalloc.c:662
    #2 0x555687a6a9d2 in _PyObject_Malloc Objects/obmalloc.c:1569
    #3 0x555687a4bc0b in clone_combined_dict_keys Objects/dictobject.c:799
    #4 0x555687a53e8f in dict_merge Objects/dictobject.c:2843
    #5 0x555687a56f71 in dict_update_common Objects/dictobject.c:2688
    #6 0x555687a56f71 in dict_update Objects/dictobject.c:2706
    #7 0x555687a13bdb in method_vectorcall_VARARGS_KEYWORDS Objects/descrobject.c:365
    #8 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #9 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #10 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #11 0x555687a09a90 in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #12 0x555687a09a90 in method_vectorcall Objects/classobject.c:91
    #13 0x55568799e2ed in _PyEval_EvalFrameDefault Python/bytecodes.c:3254
    #14 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #15 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #16 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #17 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #18 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #19 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #20 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #21 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #22 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #23 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #24 0x555687a613ae in cfunction_vectorcall_FASTCALL_KEYWORDS Objects/methodobject.c:438
    #25 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #26 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #27 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #28 0x555687ba84fa in pymain_run_module Modules/main.c:300
    #29 0x555687ba8cd9 in pymain_run_python Modules/main.c:623
    #30 0x555687ba96f9 in Py_RunMain Modules/main.c:709
    #31 0x555687ba96f9 in pymain_main Modules/main.c:739
    #32 0x555687ba96f9 in Py_BytesMain Modules/main.c:763
    #33 0x7f2791c46249 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #34 0x7f2791c46304 in __libc_start_main_impl ../csu/libc-start.c:360
    #35 0x5556879aa030 in _start (/home/kirr/local/py3.12/bin/python3.12+0x10c030) (BuildId: 90994913e85aac5c35e9f04b53a6eeee5a04786d)

Direct leak of 1520 byte(s) in 1 object(s) allocated from:
    #0 0x7f27922f3bd7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x555687a6a9d2 in PyMem_RawMalloc Objects/obmalloc.c:662
    #2 0x555687a6a9d2 in _PyObject_Malloc Objects/obmalloc.c:1569
    #3 0x555687a4d4e8 in new_keys_object Objects/dictobject.c:641
    #4 0x555687a4d4e8 in dictresize Objects/dictobject.c:1449
    #5 0x555687a53277 in insertion_resize Objects/dictobject.c:1194
    #6 0x555687a53277 in insertdict Objects/dictobject.c:1261
    #7 0x5556879a7314 in _PyEval_EvalFrameDefault Python/bytecodes.c:1023
    #8 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #9 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #10 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #11 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #12 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #13 0x5556879a5949 in _PyEval_EvalFrameDefault Python/bytecodes.c:2966
    #14 0x555687a061f5 in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #15 0x555687a061f5 in PyObject_CallOneArg Objects/call.c:401
    #16 0x555687a675f1 in _PyObject_GenericGetAttrWithDict Objects/object.c:1430
    #17 0x555687a6728d in PyObject_GetAttr Objects/object.c:1044
    #18 0x55568799fd39 in _PyEval_EvalFrameDefault Python/bytecodes.c:1794
    #19 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #20 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #21 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #22 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #23 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #24 0x555687a22c14 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #25 0x555687a22c14 in gen_send_ex2 Objects/genobject.c:230
    #26 0x555687a22c14 in gen_iternext Objects/genobject.c:604
    #27 0x555687a37fa5 in list_extend Objects/listobject.c:944
    #28 0x555687a14520 in method_vectorcall_O Objects/descrobject.c:482
    #29 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #30 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #31 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #32 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #33 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #34 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #35 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #36 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #37 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #38 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #39 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #40 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #41 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #42 0x555687b22926 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #43 0x555687b22926 in _PyEval_Vector Python/ceval.c:1683
    #44 0x555687b22926 in PyEval_EvalCode Python/ceval.c:578
    #45 0x555687b1ebdf in builtin_exec_impl Python/bltinmodule.c:1096
    #46 0x555687b1ebdf in builtin_exec Python/clinic/bltinmodule.c.h:586
    #47 0x555687a613ae in cfunction_vectorcall_FASTCALL_KEYWORDS Objects/methodobject.c:438
    #48 0x555687a05fff in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #49 0x555687a05fff in PyObject_Vectorcall Objects/call.c:325
    #50 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #51 0x555687ba84fa in pymain_run_module Modules/main.c:300
    #52 0x555687ba8cd9 in pymain_run_python Modules/main.c:623
    #53 0x555687ba96f9 in Py_RunMain Modules/main.c:709
    #54 0x555687ba96f9 in pymain_main Modules/main.c:739
    #55 0x555687ba96f9 in Py_BytesMain Modules/main.c:763
    #56 0x7f2791c46249 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #57 0x7f2791c46304 in __libc_start_main_impl ../csu/libc-start.c:360
    #58 0x5556879aa030 in _start (/home/kirr/local/py3.12/bin/python3.12+0x10c030) (BuildId: 90994913e85aac5c35e9f04b53a6eeee5a04786d)

Direct leak of 1104 byte(s) in 1 object(s) allocated from:
    #0 0x7f27922f3bd7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x555687a6a9d2 in PyMem_RawMalloc Objects/obmalloc.c:662
    #2 0x555687a6a9d2 in _PyObject_Malloc Objects/obmalloc.c:1569
    #3 0x555687a4d4e8 in new_keys_object Objects/dictobject.c:641
    #4 0x555687a4d4e8 in dictresize Objects/dictobject.c:1449
    #5 0x555687a53277 in insertion_resize Objects/dictobject.c:1194
    #6 0x555687a53277 in insertdict Objects/dictobject.c:1261
    #7 0x5556879a4de2 in _PyEval_EvalFrameDefault Python/bytecodes.c:579
    #8 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #9 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #10 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #11 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #12 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #13 0x555687a22c14 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #14 0x555687a22c14 in gen_send_ex2 Objects/genobject.c:230
    #15 0x555687a22c14 in gen_iternext Objects/genobject.c:604
    #16 0x555687a37fa5 in list_extend Objects/listobject.c:944
    #17 0x5556879a3a9a in _PyEval_EvalFrameDefault Python/bytecodes.c:3085
    #18 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #19 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #20 0x555687a8ba6c in slot_tp_call Objects/typeobject.c:8770
    #21 0x555687a05733 in _PyObject_MakeTpCall Objects/call.c:240
    #22 0x5556879a3252 in _PyEval_EvalFrameDefault Python/bytecodes.c:2706
    #23 0x555687a0833e in _PyObject_FastCallDictTstate Objects/call.c:144
    #24 0x555687a0833e in _PyObject_Call_Prepend Objects/call.c:508
    #25 0x555687a8ba6c in slot_tp_call Objec…
navytux added a commit that referenced this issue Apr 19, 2024
…ppers

The code of pychan_from_raw, that pychan.from_chan_X calls, was creating
pychan object and then setting pychan._ch to the specified raw channel.
But it missed that pychan.__new__ was creating full Python object, with
everything initialized - in particular with pychan._ch initialized to
another channel created by pychan.__cinit__ constructor, and so pointer
to that another channel was removed without decrefing it first. That
caused the leak of that second channel observable as the following
LeakSanitizer report when run on e.g. added test:

    Direct leak of 72 byte(s) in 1 object(s) allocated from:
        #0 0x7f70902f3bd7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
        #1 0x7f708bfab612 in zalloc golang/runtime/libgolang.cpp:1307
        #2 0x7f708bfa56c0 in _makechan golang/runtime/libgolang.cpp:469
        #3 0x7f708be78da2 in __pyx_f_6golang_7_golang__makechan_pyexc golang/_golang.cpp:8844
        #4 0x7f708be703ad in __pyx_pf_6golang_7_golang_6pychan___cinit__ golang/_golang.cpp:4870
        #5 0x7f708be7019d in __pyx_pw_6golang_7_golang_6pychan_1__cinit__ golang/_golang.cpp:4833
        #6 0x7f708beaa0f8 in __pyx_tp_new_6golang_7_golang_pychan golang/_golang.cpp:29896
        #7 0x7f708be743af in __pyx_f_6golang_7_golang_pychan_from_raw golang/_golang.cpp:7240
        #8 0x7f708be73e76 in __pyx_f_6golang_7_golang_6pychan_from_chan_int golang/_golang.cpp:6927
        #9 0x7f7088a990a5 in __pyx_pf_6golang_12_golang_test_62test_pychan_from_raw_noleak golang/_golang_test.cpp:7479
        #10 0x7f7088a98ef2 in __pyx_pw_6golang_12_golang_test_63test_pychan_from_raw_noleak golang/_golang_test.cpp:7445

-> Fix it by adjusting raw chan -> py chan conversion routine to first
create uninitialized py object - with no underlying channel created at all.

Adjust pynil to use pychan_from_raw instead of duplicating its code, so
that we keep the logic and the fix only in one place.

The context where this problem was originally discovered is xamari from
XLTE where on every request new timer is created to handle request
timeout, and that timer, being Python-level object, wraps underlying
C-level timer with creating pychan wrapper of that:

https://lab.nexedi.com/kirr/xlte/-/blob/8e606c64/amari/__init__.py#L182-193
https://lab.nexedi.com/nexedi/pygolang/-/blob/6dd420da/golang/_time.pyx#L96
https://lab.nexedi.com/nexedi/pygolang/-/blob/6dd420da/golang/_time.pyx#L104

As the result on every request memory was leaked on and on.

Besides new test going ok even under LeakSanitizer, the following test
program confirms the fix:

```py
from golang import context

def main():
    bg = context.background()
    key = object()
    while 1:
        ctx = context.with_value(bg, key, 1)

main()
```

Before the patch it leaks ~ 1GB of RAM every second on my computer due
to similar raw chan -> py chan wrapping in py context.with_value

https://lab.nexedi.com/nexedi/pygolang/-/blob/6dd420da/golang/_context.pyx#L169-180
https://lab.nexedi.com/nexedi/pygolang/-/blob/6dd420da/golang/_context.pyx#L38-43

After the fix that program stays at constant RSS usage forever.

/cc ORS team (@jhuge, @lu.xu, @tomo, @xavier_thompson, @Daetalus)
/reviewed-by @jerome
/reviewed-on https://lab.nexedi.com/nexedi/pygolang/-/merge_requests/24
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

No branches or pull requests

2 participants