When an exception is thrown for the first time in a given thread, there is a 16
bytes memory leak if the thread is started by a C++ library loaded using
dlopen() by a C executable.

The key factors to reproduce the leak are:
- The executable must be a C program not linked against libstdc++ and not
linked against the faulty C++ library;
- The C++ library must be loaded using dlopen();
- A leak will occur the first time a thread started by the C++ library throws
an exception.

The problem was not present in libstdc++ 6.0.3 (distributed with GCC 3.4.6),
but is present in libstdc++ 6.0.9 and libstdc++ 6.0.10.

Attached is a gzip-compressed tarball containing:
-------------------------------------------------
  main.c: The source file for the executable;
  dummy.cpp: The source file for the C++ library;
  build.sh: The bash shell script used to compile;
  main.i, main.ii: The preprocessed outputs.

Command line to compile:
------------------------
cd /cpp_exception_test; ./build.sh testlib.so

Example command line to execute:
--------------------------------
cd /cpp_exception_test; ./cpp_exception_test /cpp_exception_test 10


Note that Valgrind reports an 8 bytes leak per thread throwing a first
exception, but the memory growth seen when running a large number of iterations
is 16 bytes.

Extract from Valgrind report:
-----------------------------
==16376== 8 bytes in 1 blocks are definitely lost in loss record 1 of 12
==16376==    at 0x402517F: memalign (vg_replace_malloc.c:460)
==16376==    by 0x401055F: ___tls_get_addr (in /lib/ld-2.7.so)
==16376==    by 0x46528AA: (anonymous namespace)::get_global()
(eh_globals.cc:55)
==16376==    by 0x4652375: __cxa_allocate_exception (eh_alloc.cc:134)
==16376==    by 0x459ED41: ExceptionFunction(int) (in
/home/fg/cpp_exception_test/libtest.so)
==16376==    by 0x459EDE4: DummyThread(void*) (in
/home/fg/cpp_exception_test/libtest.so)
==16376==    by 0x402D4FA: start_thread (in
/lib/tls/i686/cmov/libpthread-2.7.so)
==16376==    by 0x4123E5D: clone (in /lib/tls/i686/cmov/libc-2.7.so)


gcc -v output:
--------------
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ./configure --quiet --enable-languages=c,c++
--prefix=/opt/gcc/4.2.4
Thread model: posix
gcc version 4.2.4

uname -a output:
----------------
Linux fred-laptop 2.6.24-19-generic #1 SMP Fri Jul 11 23:41:49 UTC 2008 i686
GNU/Linux

Linux distribution: Ubuntu 8.0.4 (Hardy Heron)


-- 
           Summary: Memory Leak in Exception Handling
           Product: gcc
           Version: 4.3.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: fgiasson1 at yahoo dot ca
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39366

Reply via email to