Skip to content

BUG: data race in f2py callback tests on free-threaded build #28122

@ngoldbaum

Description

@ngoldbaum

To reproduce this you need to build CPython and NumPy from source with thread sanitizer. See here for more details on how to do that.

If you run the f2py callback tests, you'll see the following warnings reported:

± CC=/opt/homebrew/opt/llvm/bin/clang CXX=/opt/homebrew/opt/llvm/bin/clang++ spin test -- -sv numpy/f2py/tests/test_callback.py
python(32402,0x1f6dfc240) malloc: nano zone abandoned due to inability to reserve vm space.
Invoking `build` prior to running tests:
$ /Users/goldbaum/.pyenv/versions/3.13t-dev-tsan/bin/python vendored-meson/meson/meson.py compile -C build
python(32457,0x1f6dfc240) malloc: nano zone abandoned due to inability to reserve vm space.
INFO: autodetecting backend as ninja
INFO: calculating backend command to run: /Users/goldbaum/.pyenv/versions/3.13t-dev-tsan/bin/ninja -C /Users/goldbaum/Documents/numpy/build
ninja: Entering directory `/Users/goldbaum/Documents/numpy/build'
[1/1] Generating numpy/generate-version with a custom command
Saving version to numpy/version.py
$ /Users/goldbaum/.pyenv/versions/3.13t-dev-tsan/bin/python vendored-meson/meson/meson.py install --only-changed -C build --destdir ../build-install
$ export PYTHONPATH="/Users/goldbaum/Documents/numpy/build-install/usr/lib/python3.13t/site-packages"
$ /Users/goldbaum/.pyenv/versions/3.13t-dev-tsan/bin/python -P -c 'import numpy'
python(32488,0x1f6dfc240) malloc: nano zone abandoned due to inability to reserve vm space.
$ cd /Users/goldbaum/Documents/numpy/build-install/usr/lib/python3.13t/site-packages
$ /Users/goldbaum/.pyenv/versions/3.13t-dev-tsan/bin/python -P -m pytest -m 'not slow' -sv numpy/f2py/tests/test_callback.py
python(32490,0x1f6dfc240) malloc: nano zone abandoned due to inability to reserve vm space.
=========================================================== test session starts ===========================================================
platform darwin -- Python 3.13.1+, pytest-8.3.4, pluggy-1.5.0 -- /Users/goldbaum/.pyenv/versions/3.13t-dev-tsan/bin/python
cachedir: .pytest_cache
hypothesis profile 'np.test() profile' -> database=None, deadline=None, print_blob=True, derandomize=True, suppress_health_check=[HealthCheck.data_too_large, HealthCheck.filter_too_much, HealthCheck.too_slow, HealthCheck.large_base_example, HealthCheck.function_scoped_fixture, HealthCheck.differing_executors]
rootdir: /Users/goldbaum/Documents/numpy
configfile: pytest.ini
plugins: hypothesis-6.123.2, xdist-3.6.1
collected 18 items / 7 deselected / 11 selected

numpy/f2py/tests/test_callback.py::TestF77Callback::test_docstring PASSED
numpy/f2py/tests/test_callback.py::TestF77Callback::test_string_callback PASSED
numpy/f2py/tests/test_callback.py::TestF77Callback::test_string_callback_array PASSED
numpy/f2py/tests/test_callback.py::TestF77Callback::test_threadsafety ==================
WARNING: ThreadSanitizer: data race (pid=32490)
  Atomic read of size 8 at 0x000165cbda48 by thread T5:
    #0 PyObject_Vectorcall call.c:327 (libpython3.13t.dylib:arm64+0x803f4)
    #1 _PyEval_EvalFrameDefault generated_cases.c.h:1502 (libpython3.13t.dylib:arm64+0x25f41c)
    #2 _PyEval_Vector ceval.c:1807 (libpython3.13t.dylib:arm64+0x2552cc)
    #3 _PyFunction_Vectorcall call.c (libpython3.13t.dylib:arm64+0x80aa8)
    #4 method_vectorcall classobject.c:70 (libpython3.13t.dylib:arm64+0x84714)
    #5 _PyObject_Call call.c:348 (libpython3.13t.dylib:arm64+0x806ec)
    #6 PyObject_Call call.c:373 (libpython3.13t.dylib:arm64+0x80784)
    #7 thread_run _threadmodule.c:337 (libpython3.13t.dylib:arm64+0x3b6e40)
    #8 pythread_wrapper thread_pthread.h:243 (libpython3.13t.dylib:arm64+0x320c88)

  Previous write of size 8 at 0x000165cbda48 by thread T4:
    #0 type_ready typeobject.c:8206 (libpython3.13t.dylib:arm64+0x17382c)
    #1 PyType_Ready typeobject.c:8266 (libpython3.13t.dylib:arm64+0x16d56c)
    #2 _PyObject_GenericGetAttrWithDict object.c:1655 (libpython3.13t.dylib:arm64+0x120690)
    #3 PyObject_GenericGetAttr object.c:1747 (libpython3.13t.dylib:arm64+0x120570)
    #4 fortran_getattr fortranobject.c:429 (_test_callback_TestF77Callback_ext_module.cpython-313t-darwin.so:arm64+0x9354)
    #5 PyObject_GetOptionalAttrString object.c:1364 (libpython3.13t.dylib:arm64+0x11f1ec)
    #6 PyObject_HasAttrStringWithError object.c:1140 (libpython3.13t.dylib:arm64+0x11ef94)
    #7 PyObject_HasAttrString object.c:1149 (libpython3.13t.dylib:arm64+0x11f488)
    #8 create_cb_arglist _test_callback_TestF77Callback_ext_modulemodule.c:269 (_test_callback_TestF77Callback_ext_module.cpython-313t-darwin.so:arm64+0x69a8)
    #9 f2py_rout__test_callback_TestF77Callback_ext_module_t _test_callback_TestF77Callback_ext_modulemodule.c:1291 (_test_callback_TestF77Callback_ext_module.cpython-313t-darwin.so:arm64+0x4f2c)
    #10 fortran_call fortranobject.c (_test_callback_TestF77Callback_ext_module.cpython-313t-darwin.so:arm64+0x9c84)
    #11 _PyObject_MakeTpCall call.c:242 (libpython3.13t.dylib:arm64+0x7f870)
    #12 PyObject_Vectorcall call.c:327 (libpython3.13t.dylib:arm64+0x804c8)
    #13 _PyEval_EvalFrameDefault generated_cases.c.h:1502 (libpython3.13t.dylib:arm64+0x25f41c)
    #14 _PyEval_Vector ceval.c:1807 (libpython3.13t.dylib:arm64+0x2552cc)
    #15 _PyFunction_Vectorcall call.c (libpython3.13t.dylib:arm64+0x80aa8)
    #16 method_vectorcall classobject.c:70 (libpython3.13t.dylib:arm64+0x84714)
    #17 _PyObject_Call call.c:348 (libpython3.13t.dylib:arm64+0x806ec)
    #18 PyObject_Call call.c:373 (libpython3.13t.dylib:arm64+0x80784)
    #19 thread_run _threadmodule.c:337 (libpython3.13t.dylib:arm64+0x3b6e40)
    #20 pythread_wrapper thread_pthread.h:243 (libpython3.13t.dylib:arm64+0x320c88)

  Location is global 'PyFortran_Type' at 0x000165cbd990 (_test_callback_TestF77Callback_ext_module.cpython-313t-darwin.so+0x15a48)

  Thread T5 (tid=39377788, running) created by main thread at:
    #0 pthread_create <null> (libclang_rt.tsan_osx_dynamic.dylib:arm64+0x31050)
    #1 do_start_joinable_thread thread_pthread.h:290 (libpython3.13t.dylib:arm64+0x31f8f4)
    #2 PyThread_start_joinable_thread thread_pthread.h:314 (libpython3.13t.dylib:arm64+0x31f738)
    #3 do_start_new_thread _threadmodule.c:1849 (libpython3.13t.dylib:arm64+0x3b69ec)
    #4 thread_PyThread_start_joinable_thread _threadmodule.c:1972 (libpython3.13t.dylib:arm64+0x3b5aa8)
    #5 cfunction_call methodobject.c:540 (libpython3.13t.dylib:arm64+0x115600)
    #6 _PyObject_MakeTpCall call.c:242 (libpython3.13t.dylib:arm64+0x7f870)
    #7 PyObject_Vectorcall call.c:327 (libpython3.13t.dylib:arm64+0x804c8)
    #8 _PyEval_EvalFrameDefault generated_cases.c.h:1502 (libpython3.13t.dylib:arm64+0x25f41c)
    #9 _PyEval_Vector ceval.c:1807 (libpython3.13t.dylib:arm64+0x2552cc)
    #10 _PyFunction_Vectorcall call.c (libpython3.13t.dylib:arm64+0x80aa8)
    #11 method_vectorcall classobject.c:70 (libpython3.13t.dylib:arm64+0x84714)
    #12 _PyObject_Call call.c:348 (libpython3.13t.dylib:arm64+0x806ec)
    #13 PyObject_Call call.c:373 (libpython3.13t.dylib:arm64+0x80784)
    #14 _PyEval_EvalFrameDefault generated_cases.c.h:1355 (libpython3.13t.dylib:arm64+0x25fe5c)
    #15 _PyEval_Vector ceval.c:1807 (libpython3.13t.dylib:arm64+0x2552cc)
    #16 _PyFunction_Vectorcall call.c (libpython3.13t.dylib:arm64+0x80aa8)
    #17 _PyObject_VectorcallDictTstate call.c:146 (libpython3.13t.dylib:arm64+0x7f604)
    #18 _PyObject_Call_Prepend call.c:504 (libpython3.13t.dylib:arm64+0x810f0)
    #19 slot_tp_call typeobject.c:9533 (libpython3.13t.dylib:arm64+0x17b194)
    #20 _PyObject_MakeTpCall call.c:242 (libpython3.13t.dylib:arm64+0x7f870)
    #21 PyObject_Vectorcall call.c:327 (libpython3.13t.dylib:arm64+0x804c8)
    #22 _PyEval_EvalFrameDefault generated_cases.c.h:1502 (libpython3.13t.dylib:arm64+0x25f41c)
    #23 _PyEval_Vector ceval.c:1807 (libpython3.13t.dylib:arm64+0x2552cc)
    #24 _PyFunction_Vectorcall call.c (libpython3.13t.dylib:arm64+0x80aa8)
    #25 _PyObject_VectorcallDictTstate call.c:146 (libpython3.13t.dylib:arm64+0x7f604)
    #26 _PyObject_Call_Prepend call.c:504 (libpython3.13t.dylib:arm64+0x810f0)
    #27 slot_tp_call typeobject.c:9533 (libpython3.13t.dylib:arm64+0x17b194)
    #28 _PyObject_Call call.c:361 (libpython3.13t.dylib:arm64+0x80694)
    #29 PyObject_Call call.c:373 (libpython3.13t.dylib:arm64+0x80784)
    #30 _PyEval_EvalFrameDefault generated_cases.c.h:1355 (libpython3.13t.dylib:arm64+0x25fe5c)
    #31 _PyEval_Vector ceval.c:1807 (libpython3.13t.dylib:arm64+0x2552cc)
    #32 _PyFunction_Vectorcall call.c (libpython3.13t.dylib:arm64+0x80aa8)
    #33 _PyObject_VectorcallDictTstate call.c:146 (libpython3.13t.dylib:arm64+0x7f604)
    #34 _PyObject_Call_Prepend call.c:504 (libpython3.13t.dylib:arm64+0x810f0)
    #35 slot_tp_call typeobject.c:9533 (libpython3.13t.dylib:arm64+0x17b194)
    #36 _PyObject_MakeTpCall call.c:242 (libpython3.13t.dylib:arm64+0x7f870)
    #37 PyObject_Vectorcall call.c:327 (libpython3.13t.dylib:arm64+0x804c8)
    #38 _PyEval_EvalFrameDefault generated_cases.c.h:1502 (libpython3.13t.dylib:arm64+0x25f41c)
    #39 _PyEval_Vector ceval.c:1807 (libpython3.13t.dylib:arm64+0x2552cc)
    #40 _PyFunction_Vectorcall call.c (libpython3.13t.dylib:arm64+0x80aa8)
    #41 _PyObject_VectorcallDictTstate call.c:146 (libpython3.13t.dylib:arm64+0x7f604)
    #42 _PyObject_Call_Prepend call.c:504 (libpython3.13t.dylib:arm64+0x810f0)
    #43 slot_tp_call typeobject.c:9533 (libpython3.13t.dylib:arm64+0x17b194)
    #44 _PyObject_MakeTpCall call.c:242 (libpython3.13t.dylib:arm64+0x7f870)
    #45 PyObject_Vectorcall call.c:327 (libpython3.13t.dylib:arm64+0x804c8)
    #46 _PyEval_EvalFrameDefault generated_cases.c.h:1502 (libpython3.13t.dylib:arm64+0x25f41c)
    #47 _PyEval_Vector ceval.c:1807 (libpython3.13t.dylib:arm64+0x2552cc)
    #48 _PyFunction_Vectorcall call.c (libpython3.13t.dylib:arm64+0x80aa8)
    #49 _PyObject_VectorcallDictTstate call.c:146 (libpython3.13t.dylib:arm64+0x7f604)
    #50 _PyObject_Call_Prepend call.c:504 (libpython3.13t.dylib:arm64+0x810f0)
    #51 slot_tp_call typeobject.c:9533 (libpython3.13t.dylib:arm64+0x17b194)
    #52 _PyObject_MakeTpCall call.c:242 (libpython3.13t.dylib:arm64+0x7f870)
    #53 PyObject_Vectorcall call.c:327 (libpython3.13t.dylib:arm64+0x804c8)
    #54 _PyEval_EvalFrameDefault generated_cases.c.h:1502 (libpython3.13t.dylib:arm64+0x25f41c)
    #55 PyEval_EvalCode ceval.c:597 (libpython3.13t.dylib:arm64+0x254fbc)
    #56 builtin_exec bltinmodule.c.h:556 (libpython3.13t.dylib:arm64+0x24f920)
    #57 cfunction_vectorcall_FASTCALL_KEYWORDS methodobject.c:441 (libpython3.13t.dylib:arm64+0x11491c)
    #58 PyObject_Vectorcall call.c:327 (libpython3.13t.dylib:arm64+0x8042c)
    #59 _PyEval_EvalFrameDefault generated_cases.c.h:813 (libpython3.13t.dylib:arm64+0x25e624)
    #60 _PyEval_Vector ceval.c:1807 (libpython3.13t.dylib:arm64+0x2552cc)
    #61 _PyFunction_Vectorcall call.c (libpython3.13t.dylib:arm64+0x80aa8)
    #62 _PyObject_Call call.c:348 (libpython3.13t.dylib:arm64+0x806ec)
    #63 PyObject_Call call.c:373 (libpython3.13t.dylib:arm64+0x80784)
    #64 pymain_run_module main.c:349 (libpython3.13t.dylib:arm64+0x3362a4)
    #65 Py_RunMain main.c:776 (libpython3.13t.dylib:arm64+0x3359a4)
    #66 pymain_main main.c:806 (libpython3.13t.dylib:arm64+0x336040)
    #67 Py_BytesMain main.c:830 (libpython3.13t.dylib:arm64+0x336118)
    #68 main <null> (python3.13:arm64+0x100003ec4)

  Thread T4 (tid=39377787, running) created by main thread at:
    #0 pthread_create <null> (libclang_rt.tsan_osx_dynamic.dylib:arm64+0x31050)
    #1 do_start_joinable_thread thread_pthread.h:290 (libpython3.13t.dylib:arm64+0x31f8f4)
    #2 PyThread_start_joinable_thread thread_pthread.h:314 (libpython3.13t.dylib:arm64+0x31f738)
    #3 do_start_new_thread _threadmodule.c:1849 (libpython3.13t.dylib:arm64+0x3b69ec)
    #4 thread_PyThread_start_joinable_thread _threadmodule.c:1972 (libpython3.13t.dylib:arm64+0x3b5aa8)
    #5 cfunction_call methodobject.c:540 (libpython3.13t.dylib:arm64+0x115600)
    #6 _PyObject_MakeTpCall call.c:242 (libpython3.13t.dylib:arm64+0x7f870)
    #7 PyObject_Vectorcall call.c:327 (libpython3.13t.dylib:arm64+0x804c8)
    #8 _PyEval_EvalFrameDefault generated_cases.c.h:1502 (libpython3.13t.dylib:arm64+0x25f41c)
    #9 _PyEval_Vector ceval.c:1807 (libpython3.13t.dylib:arm64+0x2552cc)
    #10 _PyFunction_Vectorcall call.c (libpython3.13t.dylib:arm64+0x80aa8)
    #11 method_vectorcall classobject.c:70 (libpython3.13t.dylib:arm64+0x84714)
    #12 _PyObject_Call call.c:348 (libpython3.13t.dylib:arm64+0x806ec)
    #13 PyObject_Call call.c:373 (libpython3.13t.dylib:arm64+0x80784)
    #14 _PyEval_EvalFrameDefault generated_cases.c.h:1355 (libpython3.13t.dylib:arm64+0x25fe5c)
    #15 _PyEval_Vector ceval.c:1807 (libpython3.13t.dylib:arm64+0x2552cc)
    #16 _PyFunction_Vectorcall call.c (libpython3.13t.dylib:arm64+0x80aa8)
    #17 _PyObject_VectorcallDictTstate call.c:146 (libpython3.13t.dylib:arm64+0x7f604)
    #18 _PyObject_Call_Prepend call.c:504 (libpython3.13t.dylib:arm64+0x810f0)
    #19 slot_tp_call typeobject.c:9533 (libpython3.13t.dylib:arm64+0x17b194)
    #20 _PyObject_MakeTpCall call.c:242 (libpython3.13t.dylib:arm64+0x7f870)
    #21 PyObject_Vectorcall call.c:327 (libpython3.13t.dylib:arm64+0x804c8)
    #22 _PyEval_EvalFrameDefault generated_cases.c.h:1502 (libpython3.13t.dylib:arm64+0x25f41c)
    #23 _PyEval_Vector ceval.c:1807 (libpython3.13t.dylib:arm64+0x2552cc)
    #24 _PyFunction_Vectorcall call.c (libpython3.13t.dylib:arm64+0x80aa8)
    #25 _PyObject_VectorcallDictTstate call.c:146 (libpython3.13t.dylib:arm64+0x7f604)
    #26 _PyObject_Call_Prepend call.c:504 (libpython3.13t.dylib:arm64+0x810f0)
    #27 slot_tp_call typeobject.c:9533 (libpython3.13t.dylib:arm64+0x17b194)
    #28 _PyObject_Call call.c:361 (libpython3.13t.dylib:arm64+0x80694)
    #29 PyObject_Call call.c:373 (libpython3.13t.dylib:arm64+0x80784)
    #30 _PyEval_EvalFrameDefault generated_cases.c.h:1355 (libpython3.13t.dylib:arm64+0x25fe5c)
    #31 _PyEval_Vector ceval.c:1807 (libpython3.13t.dylib:arm64+0x2552cc)
    #32 _PyFunction_Vectorcall call.c (libpython3.13t.dylib:arm64+0x80aa8)
    #33 _PyObject_VectorcallDictTstate call.c:146 (libpython3.13t.dylib:arm64+0x7f604)
    #34 _PyObject_Call_Prepend call.c:504 (libpython3.13t.dylib:arm64+0x810f0)
    #35 slot_tp_call typeobject.c:9533 (libpython3.13t.dylib:arm64+0x17b194)
    #36 _PyObject_MakeTpCall call.c:242 (libpython3.13t.dylib:arm64+0x7f870)
    #37 PyObject_Vectorcall call.c:327 (libpython3.13t.dylib:arm64+0x804c8)
    #38 _PyEval_EvalFrameDefault generated_cases.c.h:1502 (libpython3.13t.dylib:arm64+0x25f41c)
    #39 _PyEval_Vector ceval.c:1807 (libpython3.13t.dylib:arm64+0x2552cc)
    #40 _PyFunction_Vectorcall call.c (libpython3.13t.dylib:arm64+0x80aa8)
    #41 _PyObject_VectorcallDictTstate call.c:146 (libpython3.13t.dylib:arm64+0x7f604)
    #42 _PyObject_Call_Prepend call.c:504 (libpython3.13t.dylib:arm64+0x810f0)
    #43 slot_tp_call typeobject.c:9533 (libpython3.13t.dylib:arm64+0x17b194)
    #44 _PyObject_MakeTpCall call.c:242 (libpython3.13t.dylib:arm64+0x7f870)
    #45 PyObject_Vectorcall call.c:327 (libpython3.13t.dylib:arm64+0x804c8)
    #46 _PyEval_EvalFrameDefault generated_cases.c.h:1502 (libpython3.13t.dylib:arm64+0x25f41c)
    #47 _PyEval_Vector ceval.c:1807 (libpython3.13t.dylib:arm64+0x2552cc)
    #48 _PyFunction_Vectorcall call.c (libpython3.13t.dylib:arm64+0x80aa8)
    #49 _PyObject_VectorcallDictTstate call.c:146 (libpython3.13t.dylib:arm64+0x7f604)
    #50 _PyObject_Call_Prepend call.c:504 (libpython3.13t.dylib:arm64+0x810f0)
    #51 slot_tp_call typeobject.c:9533 (libpython3.13t.dylib:arm64+0x17b194)
    #52 _PyObject_MakeTpCall call.c:242 (libpython3.13t.dylib:arm64+0x7f870)
    #53 PyObject_Vectorcall call.c:327 (libpython3.13t.dylib:arm64+0x804c8)
    #54 _PyEval_EvalFrameDefault generated_cases.c.h:1502 (libpython3.13t.dylib:arm64+0x25f41c)
    #55 PyEval_EvalCode ceval.c:597 (libpython3.13t.dylib:arm64+0x254fbc)
    #56 builtin_exec bltinmodule.c.h:556 (libpython3.13t.dylib:arm64+0x24f920)
    #57 cfunction_vectorcall_FASTCALL_KEYWORDS methodobject.c:441 (libpython3.13t.dylib:arm64+0x11491c)
    #58 PyObject_Vectorcall call.c:327 (libpython3.13t.dylib:arm64+0x8042c)
    #59 _PyEval_EvalFrameDefault generated_cases.c.h:813 (libpython3.13t.dylib:arm64+0x25e624)
    #60 _PyEval_Vector ceval.c:1807 (libpython3.13t.dylib:arm64+0x2552cc)
    #61 _PyFunction_Vectorcall call.c (libpython3.13t.dylib:arm64+0x80aa8)
    #62 _PyObject_Call call.c:348 (libpython3.13t.dylib:arm64+0x806ec)
    #63 PyObject_Call call.c:373 (libpython3.13t.dylib:arm64+0x80784)
    #64 pymain_run_module main.c:349 (libpython3.13t.dylib:arm64+0x3362a4)
    #65 Py_RunMain main.c:776 (libpython3.13t.dylib:arm64+0x3359a4)
    #66 pymain_main main.c:806 (libpython3.13t.dylib:arm64+0x336040)
    #67 Py_BytesMain main.c:830 (libpython3.13t.dylib:arm64+0x336118)
    #68 main <null> (python3.13:arm64+0x100003ec4)

SUMMARY: ThreadSanitizer: data race call.c:327 in PyObject_Vectorcall

Metadata

Metadata

Assignees

No one assigned

    Labels

    00 - Bug39 - free-threadingPRs and issues related to support for free-threading CPython (a.k.a. no-GIL, PEP 703)

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions