https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90904

            Bug ID: 90904
           Summary: vec assignment and copying undefined
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: other
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

Compiling the following function succeeds but running the code crashes with the
stack trace below.  The problem is that even though it owns (allocates and
deallocates) its own memory in its ctor and dtor, the auto_vec class fails to
define the copy assignment operator (or copy constructor) to allocate memory
for the copy.  As a result, a compiler-generated copy assignment and copy ctor
are provided which simply copy the pointer to memory owned by the original to
the other object.  That results in a double free upon destruction of the
original.

  void f (void)
  {
    auto_vec<int> a;
    a.safe_push (1);
    auto_vec<int> b;
    b = a;
    if (a.length () != b.length ())
      abort ();
  }

free(): double free detected in tcache 2
...
0x111471e crash_signal
        gcc/toplev.c:326
0x97fd04 void va_heap::release<int>(vec<int, va_heap, vl_embed>*&)
        gcc/vec.h:311
0x97fb77 vec<int, va_heap, vl_ptr>::release()
        gcc/vec.h:1690
0x9fd84f auto_vec<int, 0ul>::~auto_vec()
        gcc/vec.h:1463


The vec base class provides a copy() member function to copy the data that one
would hope to be able to use to copy auto_vec instances.  Regrettably, the copy
function returns a vec class so it cannot be used to copy the derived auto_vec.
 The vec base too fails to provide a user-defined copy ctor so it's also unsafe
to copy using the expected syntax.

Reply via email to