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

            Bug ID: 67773
           Summary: dealloc called on temp object before and named object
                    after move, while not being called on named object
                    before move
           Product: gcc
           Version: 4.8.4
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: awenocur at aol dot com
  Target Milestone: ---

Created attachment 36420
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36420&action=edit
pre-processed C++11 file exhibiting this behavior

The problem occurs on line 23813 of the provided .ii file.
An object initialized with specific parameters is dealloc'd once before moving,
and once after moving, while the target of the move is never dealloc'd.

This demo is simplified from a program I'm writing that has to assign an object
with an embedded pointer.  In the original, this object is destroyed twice
separately, resulting in a double free on the pointer.  In the demo there is no
pointer member, but the undesired behavior is the same.
The workaround featured in the demo is the same one that fixed the real
program.

This problem appears to exist on dialects of C++, at least from '03 onward, but
I chose to use C++11, because move constructors can be explicitly declared.  In
C++03, it does the move in the same manner.

compilation command:
c++ -g -O0 -std=c++11 -save-temps -o test test.cpp

GCC info:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu
4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs
--enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr
--program-suffix=-4.8 --enable-shared --enable-linker-build-id
--libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls
--with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug
--enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap
--enable-plugin --with-system-zlib --disable-browser-plugin
--enable-java-awt=gtk --enable-gtk-cairo
--with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home
--with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64
--with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64
--with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar
--enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686
--with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic
--enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu
--target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) 

OS description:
Ubuntu 3.13.0-48.80-generic 3.13.11-ckt16

Reply via email to