Skip to content

Memory leak detected when using CFFI in any API mode #211

@K0tB0ris

Description

@K0tB0ris

Hi. On Linux, when compiling Python with ASAN using:

./configure --prefix=NAME --enable-pystats --without-pymalloc --with-pydebug --with-address-sanitizer --with-undefined-behavior-sanitizer

and then running CFFI in any API mode, we encounter memory leaks.

CFFI-MemoryLeak/src/API-MainMode$ pydebug build.py 

generating ./_pi_cffi.c
the current directory is 'CFFI-MemoryLeak/src/API-MainMode'


CFFI-MemoryLeak/src/API-MainMode$ pydebug test.py 
70.71067811865476

=================================================================
==63951==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 208 byte(s) in 1 object(s) allocated from:
    #0 0x7c95ac6fd9c7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x5e4b61d5448d in _PyMem_RawMalloc Objects/obmalloc.c:45
    #2 0x5e4b61d55e7a in _PyMem_DebugRawAlloc Objects/obmalloc.c:2096
    #3 0x5e4b61d55f91 in _PyMem_DebugRawMalloc Objects/obmalloc.c:2129
    #4 0x5e4b61d55fbb in _PyMem_DebugMalloc Objects/obmalloc.c:2281
    #5 0x5e4b61d5a3c0 in PyObject_Malloc Objects/obmalloc.c:801
    #6 0x5e4b6224879f in gc_alloc Modules/gcmodule.c:2330
    #7 0x5e4b62248b1b in _PyObject_GC_New Modules/gcmodule.c:2345
    #8 0x7c95ab249025 in ffi_internal_new (/home/kotboris/pythonExp/lib/python3.12/site-packages/_cffi_backend.cpython-312-x86_64-linux-gnu.so+0x23025) (BuildId: 5b2225c347aec0c67666bb29c5ea7330b09c5fe5)
    #9 0x7c95ab250094 in b_init_cffi_1_0_external_module (/home/kotboris/pythonExp/lib/python3.12/site-packages/_cffi_backend.cpython-312-x86_64-linux-gnu.so+0x2a094) (BuildId: 5b2225c347aec0c67666bb29c5ea7330b09c5fe5)
    #10 0x5e4b61d3c763 in cfunction_vectorcall_O Objects/methodobject.c:509
    #11 0x5e4b61c14584 in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #12 0x5e4b61c14f19 in _PyObject_CallFunctionVa Objects/call.c:562
    #13 0x5e4b61c1594e in callmethod Objects/call.c:634
    #14 0x5e4b61c15bf7 in PyObject_CallMethod Objects/call.c:653
    #15 0x7c95abc1c810 in _cffi_init /home/kotboris/PYSATL/CFFI-MemoryLeak/src/API-MainMode/_pi_cffi.c:434
    #16 0x7c95abc1c91d in PyInit__pi_cffi /home/kotboris/PYSATL/CFFI-MemoryLeak/src/API-MainMode/_pi_cffi.c:661
    #17 0x5e4b6211b071 in _PyImport_LoadDynamicModuleWithSpec Python/importdl.c:169
    #18 0x5e4b62115fd2 in _imp_create_dynamic_impl Python/import.c:3789
    #19 0x5e4b621160b7 in _imp_create_dynamic Python/clinic/import.c.h:506
    #20 0x5e4b61d3c585 in cfunction_vectorcall_FASTCALL Objects/methodobject.c:422
    #21 0x5e4b61c18d5f in _PyVectorcall_Call Objects/call.c:271
    #22 0x5e4b61c19914 in _PyObject_Call Objects/call.c:354
    #23 0x5e4b61c199ab in PyObject_Call Objects/call.c:379
    #24 0x5e4b620333d6 in _PyEval_EvalFrameDefault Python/bytecodes.c:3263
    #25 0x5e4b6203dee1 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #26 0x5e4b6203e212 in _PyEval_Vector Python/ceval.c:1685
    #27 0x5e4b61c13c25 in _PyFunction_Vectorcall Objects/call.c:419
    #28 0x5e4b61c14584 in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #29 0x5e4b61c170e2 in object_vacall Objects/call.c:850

Direct leak of 138 byte(s) in 1 object(s) allocated from:
    #0 0x7c95ac6fd9c7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x5e4b61d5448d in _PyMem_RawMalloc Objects/obmalloc.c:45
    #2 0x5e4b61d55e7a in _PyMem_DebugRawAlloc Objects/obmalloc.c:2096
    #3 0x5e4b61d55f91 in _PyMem_DebugRawMalloc Objects/obmalloc.c:2129
    #4 0x5e4b61d55fbb in _PyMem_DebugMalloc Objects/obmalloc.c:2281
    #5 0x5e4b61d598eb in PyMem_Malloc Objects/obmalloc.c:703
    #6 0x7c95ab24c2cb in lib_build_cpython_func (/home/kotboris/pythonExp/lib/python3.12/site-packages/_cffi_backend.cpython-312-x86_64-linux-gnu.so+0x262cb) (BuildId: 5b2225c347aec0c67666bb29c5ea7330b09c5fe5)
    #7 0x7c95ab24c862 in lib_build_and_cache_attr (/home/kotboris/pythonExp/lib/python3.12/site-packages/_cffi_backend.cpython-312-x86_64-linux-gnu.so+0x26862) (BuildId: 5b2225c347aec0c67666bb29c5ea7330b09c5fe5)
    #8 0x7c95ab24d2fc in lib_getattr (/home/kotboris/pythonExp/lib/python3.12/site-packages/_cffi_backend.cpython-312-x86_64-linux-gnu.so+0x272fc) (BuildId: 5b2225c347aec0c67666bb29c5ea7330b09c5fe5)
    #9 0x5e4b61d50b0b in PyObject_GetAttr Objects/object.c:1060
    #10 0x5e4b61fe9661 in _PyEval_EvalFrameDefault Python/bytecodes.c:1802
    #11 0x5e4b6203dee1 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #12 0x5e4b6203e212 in _PyEval_Vector Python/ceval.c:1685
    #13 0x5e4b6203e54e in PyEval_EvalCode Python/ceval.c:580
    #14 0x5e4b6219ea24 in run_eval_code_obj Python/pythonrun.c:1757
    #15 0x5e4b6219ec3b in run_mod Python/pythonrun.c:1778
    #16 0x5e4b621a21ff in pyrun_file Python/pythonrun.c:1674
    #17 0x5e4b621a6f6f in _PyRun_SimpleFileObject Python/pythonrun.c:459
    #18 0x5e4b621a7254 in _PyRun_AnyFileObject Python/pythonrun.c:78
    #19 0x5e4b62239014 in pymain_run_file_obj Modules/main.c:361
    #20 0x5e4b622392ee in pymain_run_file Modules/main.c:380
    #21 0x5e4b6223bfd3 in pymain_run_python Modules/main.c:634
    #22 0x5e4b6223c1db in Py_RunMain Modules/main.c:714
    #23 0x5e4b6223c3f0 in pymain_main Modules/main.c:744
    #24 0x5e4b6223c775 in Py_BytesMain Modules/main.c:768
    #25 0x5e4b61967425 in main Programs/python.c:15
    #26 0x7c95aba2a1c9 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #27 0x7c95aba2a28a in __libc_start_main_impl ../csu/libc-start.c:360
    #28 0x5e4b61967354 in _start (/home/kotboris/pythonExp/bin/python3.12+0x1165354) (BuildId: 1677bd47c890dd8f14394ed77827d2f1c359d1f9)

Direct leak of 128 byte(s) in 1 object(s) allocated from:
    #0 0x7c95ac6fd9c7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x5e4b61d5448d in _PyMem_RawMalloc Objects/obmalloc.c:45
    #2 0x5e4b61d55e7a in _PyMem_DebugRawAlloc Objects/obmalloc.c:2096
    #3 0x5e4b61d55f91 in _PyMem_DebugRawMalloc Objects/obmalloc.c:2129
    #4 0x5e4b61d55fbb in _PyMem_DebugMalloc Objects/obmalloc.c:2281
    #5 0x5e4b61d598eb in PyMem_Malloc Objects/obmalloc.c:703
    #6 0x7c95ab24feb4 in _my_Py_InitModule (/home/kotboris/pythonExp/lib/python3.12/site-packages/_cffi_backend.cpython-312-x86_64-linux-gnu.so+0x29eb4) (BuildId: 5b2225c347aec0c67666bb29c5ea7330b09c5fe5)
    #7 0x7c95ab25006c in b_init_cffi_1_0_external_module (/home/kotboris/pythonExp/lib/python3.12/site-packages/_cffi_backend.cpython-312-x86_64-linux-gnu.so+0x2a06c) (BuildId: 5b2225c347aec0c67666bb29c5ea7330b09c5fe5)
    #8 0x5e4b61d3c763 in cfunction_vectorcall_O Objects/methodobject.c:509
    #9 0x5e4b61c14584 in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #10 0x5e4b61c14f19 in _PyObject_CallFunctionVa Objects/call.c:562
    #11 0x5e4b61c1594e in callmethod Objects/call.c:634
    #12 0x5e4b61c15bf7 in PyObject_CallMethod Objects/call.c:653
    #13 0x7c95abc1c810 in _cffi_init /home/kotboris/PYSATL/CFFI-MemoryLeak/src/API-MainMode/_pi_cffi.c:434
    #14 0x7c95abc1c91d in PyInit__pi_cffi /home/kotboris/PYSATL/CFFI-MemoryLeak/src/API-MainMode/_pi_cffi.c:661
    #15 0x5e4b6211b071 in _PyImport_LoadDynamicModuleWithSpec Python/importdl.c:169
    #16 0x5e4b62115fd2 in _imp_create_dynamic_impl Python/import.c:3789
    #17 0x5e4b621160b7 in _imp_create_dynamic Python/clinic/import.c.h:506
    #18 0x5e4b61d3c585 in cfunction_vectorcall_FASTCALL Objects/methodobject.c:422
    #19 0x5e4b61c18d5f in _PyVectorcall_Call Objects/call.c:271
    #20 0x5e4b61c19914 in _PyObject_Call Objects/call.c:354
    #21 0x5e4b61c199ab in PyObject_Call Objects/call.c:379
    #22 0x5e4b620333d6 in _PyEval_EvalFrameDefault Python/bytecodes.c:3263
    #23 0x5e4b6203dee1 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #24 0x5e4b6203e212 in _PyEval_Vector Python/ceval.c:1685
    #25 0x5e4b61c13c25 in _PyFunction_Vectorcall Objects/call.c:419
    #26 0x5e4b61c14584 in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #27 0x5e4b61c170e2 in object_vacall Objects/call.c:850
    #28 0x5e4b61c1742b in PyObject_CallMethodObjArgs Objects/call.c:911
    #29 0x5e4b62112ad4 in import_find_and_load Python/import.c:2793

Indirect leak of 88 byte(s) in 1 object(s) allocated from:
    #0 0x7c95ac6fd9c7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x5e4b61d5448d in _PyMem_RawMalloc Objects/obmalloc.c:45
    #2 0x5e4b61d55e7a in _PyMem_DebugRawAlloc Objects/obmalloc.c:2096
    #3 0x5e4b61d55f91 in _PyMem_DebugRawMalloc Objects/obmalloc.c:2129
    #4 0x5e4b61d55fbb in _PyMem_DebugMalloc Objects/obmalloc.c:2281
    #5 0x5e4b61d5a3c0 in PyObject_Malloc Objects/obmalloc.c:801
    #6 0x5e4b6224879f in gc_alloc Modules/gcmodule.c:2330
    #7 0x5e4b62248b1b in _PyObject_GC_New Modules/gcmodule.c:2345
    #8 0x5e4b61cfc949 in new_dict Objects/dictobject.c:751
    #9 0x5e4b61cff9a6 in PyDict_New Objects/dictobject.c:854
    #10 0x5e4b61cff9f7 in dict_new_presized Objects/dictobject.c:1593
    #11 0x5e4b61d0bacb in _PyDict_FromItems Objects/dictobject.c:1636
    #12 0x5e4b61fe21a8 in _PyEval_EvalFrameDefault Python/bytecodes.c:1548
    #13 0x5e4b6203dee1 in _PyEval_EvalFrame Include/internal/pycore_ceval.h:89
    #14 0x5e4b6203e212 in _PyEval_Vector Python/ceval.c:1685
    #15 0x5e4b61c13c25 in _PyFunction_Vectorcall Objects/call.c:419
    #16 0x5e4b61c14584 in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #17 0x5e4b61c170e2 in object_vacall Objects/call.c:850
    #18 0x5e4b61c1742b in PyObject_CallMethodObjArgs Objects/call.c:911
    #19 0x5e4b62112ad4 in import_find_and_load Python/import.c:2793
    #20 0x5e4b62118b02 in PyImport_ImportModuleLevelObject Python/import.c:2876
    #21 0x5e4b61f88b7f in builtin___import___impl Python/bltinmodule.c:276
    #22 0x5e4b61f89018 in builtin___import__ Python/clinic/bltinmodule.c.h:107
    #23 0x5e4b61d3c073 in cfunction_vectorcall_FASTCALL_KEYWORDS Objects/methodobject.c:438
    #24 0x5e4b61c14584 in _PyObject_VectorcallTstate Include/internal/pycore_call.h:92
    #25 0x5e4b61c14f19 in _PyObject_CallFunctionVa Objects/call.c:562
    #26 0x5e4b61c1552a in PyObject_CallFunction Objects/call.c:584
    #27 0x5e4b6211936b in PyImport_Import Python/import.c:3062
    #28 0x5e4b6211947f in PyImport_ImportModule Python/import.c:2486
    #29 0x5e4b6217bfaa in init_import_site Python/pylifecycle.c:2317

SUMMARY: AddressSanitizer: 562 byte(s) leaked in 4 allocation(s).

An example demonstrating this issue is available in the repository

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions