pybind11 icon indicating copy to clipboard operation
pybind11 copied to clipboard

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

Open user706 opened this issue 1 year ago • 1 comments

Required prerequisites

  • [X] Make sure you've read the documentation. Your issue may be addressed there.
  • [X] Search the issue tracker and Discussions to verify that this hasn't already been reported. +1 or comment there if it has.
  • [ ] Consider asking first in the Gitter chat room or in a Discussion.

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

  • Fails only with numpy and py::array_t and "single" py::scoped_interpreter
    (~> branch main)
  • Does not fail, when having only single py::scoped_interpreter
    (~> branch works_when_having_only_single_scoped_interpreter -> see diff): why?
  • Does not fail, when changing to py::list
    (~> branch works_when_removing_numpy -> see diff): why? (perhaps because of no import)

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 avatar Oct 15 '24 16:10 user706