[Bug libstdc++/93960] New: std::to_address doesn't work with past-the-end Debug Mode iterators
redi at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Feb 27 15:21:00 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93960
Bug ID: 93960
Summary: std::to_address doesn't work with past-the-end Debug
Mode iterators
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: redi at gcc dot gnu.org
Target Milestone: ---
// -std=gnu++2a
#define _GLIBCXX_DEBUG
#include <vector>
int main()
{
std::vector<int> v{1, 2, 3};
(void) std::to_address(v.end());
}
This aborts:
/home/jwakely/gcc/10/include/c++/10.0.1/debug/safe_iterator.h:311:
In function:
__gnu_debug::_Safe_iterator<_Iterator, _Sequence, _Category>::pointer
__gnu_debug::_Safe_iterator<_Iterator, _Sequence,
_Category>::operator->() const [with _Iterator =
__gnu_cxx::__normal_iterator<int*, std::__cxx1998::vector<int,
std::allocator<int> > >; _Sequence = std::__debug::vector<int>;
_Category = std::forward_iterator_tag;
__gnu_debug::_Safe_iterator<_Iterator, _Sequence, _Category>::pointer =
int*]
Error: attempt to dereference a past-the-end iterator.
Objects involved in the operation:
iterator "this" @ 0x0x7ffca2d5b330 {
type = __gnu_cxx::__normal_iterator<int*, std::__cxx1998::vector<int,
std::allocator<int> > > (mutable iterator);
state = past-the-end;
references sequence with type 'std::__debug::vector<int,
std::allocator<int> >' @ 0x0x7ffca2d5b2e0
}
Aborted (core dumped)
We probably do want to be able to assert in operator-> so that we catch things
like end->foo() but we also need std::to_address to work.
The solution might be to overload std::to_address for our safe iterators, so
that it returns the _Base::operator->() pointer without doing the assertions.
More information about the Gcc-bugs
mailing list