[Bug c++/59829] New: Calling vector::data() occurs undefined behavior when the vector is empty
lin90162 at gmail dot com
gcc-bugzilla@gcc.gnu.org
Wed Jan 15 15:36:00 GMT 2014
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59829
Bug ID: 59829
Summary: Calling vector::data() occurs undefined behavior when
the vector is empty
Product: gcc
Version: 4.8.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: lin90162 at gmail dot com
When vector is empty, calling vector::data() occurs undefined behavior by
dereferencing NULL.
The implementation of vector::data() and vector::front() in libstdc++ are below
/// BEGIN OF CODE
reference
front()
{ return *begin(); }
const_reference
front() const
{ return *begin(); }
data() _GLIBCXX_NOEXCEPT
{ return std::__addressof(front()); }
data() _GLIBCXX_NOEXCEPT
{ return std::__addressof(front()); }
/// END OF CODE
Here, when vector is empty, begin() is called, then begin() returns NULL and it
is dereferenced.
N3337 23.3.6.4 says "Returns: A pointer such that [data(),data() + size()) is a
valid range. For a non-empty vector, data() == &front()".
It means that calling vector::data() is well-defined even if vector is empty.
As additional information, libc++ implementation of vector::data() can be
called safely when vector is empty.
More information about the Gcc-bugs
mailing list