Closed
Description
Issue
Attempting to iterate over python iterable, in c++, iterates past the end with bound c++ types. It seems that comparing the end iterator to the sentinel attempts to advance the end iterator past the end. When iterating a python type calling PyIter_Next past the end simply returns NULL however for a bound STL container this invokes undefined behaviour.
Occurs on:
Windows 10 (VS 2017), Ubuntu 17.04 (gcc 7.0)
pybind11 2.1.1 and master ( 0365d49 )
Example
cpp:
#include <pybind11/pybind11.h>
#include <pybind11/stl_bind.h>
namespace py = pybind11;
PYBIND11_MAKE_OPAQUE(std::vector<int>)
PYBIND11_MODULE(IterableTest, m)
{
py::bind_vector<std::vector<int>>(m, "VectorInt");
m.def("iter_test", [] (py::iterable iterable)
{
auto iter = py::iter(iterable);
while (iter != py::iterator::sentinel())
{
py::print("got value: ", *iter);
++iter;
}
});
}
python:
from IterableTest import *
ivec = VectorInt()
ivec.append(3)
ivec.append(2)
ivec.append(1)
iter_test(ivec)
example output:
got value: 3
got value: 2
got value: 1
*debug assert iterator is not incrementable*
Metadata
Metadata
Assignees
Labels
No labels