pybind / pybind11

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

[BUG]: 2 successive py::scoped_interpreter -> double free or corruption (out) #5412

Open user706 opened 1 day ago

user706 commented 1 day ago

Required prerequisites

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

v2.13

Problem description

I get: double free or corruption (out)

Happens when having 2 successive non-overlapping py::scoped_interpreter (and doing module imports):

{
    py::scoped_interpreter inter;
    py::object imported = py::module::import("mysum"); // mysum.py imports e.g. numpy
}

{
    py::scoped_interpreter inter;                      // again
    py::object imported = py::module::import("mysum"); // crash !   double free or corruption (out)
}

Reproducible example code

Reproducible example: https://github.com/user706/pybind11_test

Do this:

git clone https://github.com/user706/pybind11_test
cd pybind11_test
mkdir build/
cd    build/
cmake ..              # will clone https://github.com/pybind/pybind11.git (stable)
cmake --build . -j    # will also copy mysum.py into the build/ directory
./go                  # run (need a python with numpy)

result:

Sum is: 15
double free or corruption (out)
Aborted (core dumped)

It fails in this line, but only the 2nd time through the loop!!!

But if I simply change the following line
constexpr int NUM_LOOPS = 2;
to this
constexpr int NUM_LOOPS = 1;
then it will not fail.

Why does it fail with NUM_LOOPS = 2?
How can one fix it?

Thanks

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

Not a regression

user706 commented 18 hours ago

Probably similar to this: https://github.com/pybind/pybind11/issues/1439

=> But is there no way to have multiple successive (non-overlapping) py::scoped_interpreters ?

A criticial question could be:
what is the use of py::scoped_interpreter, if I cannot use 2 successive nonoverlapping instances of it???