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.

Reply via email to