pybind / pybind11

Seamless operability between C++11 and Python
https://pybind11.readthedocs.io/
Other
15.8k stars 2.12k forks source link

[BUG]: `type_info` data races in free threaded Python #5421

Open colesbury opened 4 weeks ago

colesbury commented 4 weeks ago

Required prerequisites

What version (or hash if on master) of pybind11 are you using?

master

Problem description

There are a few related data races in free threaded Python (3.13t) involving detail::type_info.

The most serious (found by @vfdev-5) is that the std::vector<type_info *> in registered_types_py is populated outside the internals lock, so a thread may incorrectly see an empty vector (or other crashes). Victor has a PR that addresses this race (#5419).

The other data races are because some fields in type_info may be modified after creation:

Additionally, a few fields are written after the type_info is exposed in registered_types_cpp/registered_types_py -- I think we want to reorder it so that those fields are initialized earlier.

Finally, there are a few fields that I think are mostly okay in typical usage, but I'm not entirely sure:

I think these are okay because they're typically invoked when the type is bound, before the type_info is used by other threads.

Reproducible example code

See test case in https://github.com/pybind/pybind11/pull/5419

Is this a regression? Put the last known working version here if it is.

Not a regression