public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/58142] New: _pthread_tsd_cleanup called before destructors are called
@ 2013-08-12 21:48 soonhok at cs dot cmu.edu
  0 siblings, 0 replies; only message in thread
From: soonhok at cs dot cmu.edu @ 2013-08-12 21:48 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 58142
           Summary: _pthread_tsd_cleanup called before destructors are
                    called
           Product: gcc
           Version: 4.8.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: soonhok at cs dot cmu.edu

Created attachment 30638
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=30638&action=edit
preprocessed input file

It seems when a thread is finished, its thread cleanup routine is called before
destructors of TLS(Thread Local Storage) variables are called and it causes
(possible) segmentation faults. I provided a simplified small program which
reproduces the behavior. Even if it doesn't generate a segmentation fault,
running valgrind over it indicates the same problem is going on in run-time.

This problem happens only on OSX. When I tried the same C++ code on Ubuntu12.04
with g++-4.8.1. There was no problem. I also tried with clang++-3.3 on OSX.
There was no problem either.


1. The exact version of GCC:

   gcc-4.8.1

2. the system type: 

   OSX 10.8.4, Darwin air 12.4.0 Darwin Kernel Version 12.4.0

3. the options given when GCC was configured/built:

   g++-4.8 -std=c++11 thread.cpp -O thread

4. the complete command line that triggers the bug;

   valgrind thread

5. the compiler output (error messages, warnings, etc.); and
the preprocessed file (*.i*) that triggers the bug, generated by adding
-save-temps to the complete compilation command, or, in the case of a bug
report for the GNAT front end, a complete set of source files (see below).

Preprocessed file is attached. Here is the original source code (much shorter):
======================================================================
#include <thread>
#include <iostream>
#include <mutex>
#include <vector>

static void foo() {
    static thread_local std::vector<int> v(1024);
    if (v.size() != 1024) {
        std::cerr << "Error\n";
        exit(1);
    }
}

static void tst1() {
    unsigned n = 5;
    for (unsigned i = 0; i < n; i++) {
        std::thread t([](){ foo(); });
        t.join();
    }
}

int main() {
    tst1();
}
======================================================================

The following is the output of valgrind:

...

==18408== Invalid read of size 8
==18408==    at 0x1000021B3: std::_Vector_base<int, std::allocator<int>
>::~_Vector_base() (in ./a.out)
==18408==    by 0x100002054: std::vector<int, std::allocator<int> >::~vector()
(in ./a.out)
==18408==    by 0xB9F5: (anonymous namespace)::run(void*) (in
/usr/local/lib/libstdc++.6.dylib)
==18408==    by 0x29CA01: _pthread_exit (in /usr/lib/system/libsystem_c.dylib)
==18408==    by 0x29C7AC: _pthread_start (in /usr/lib/system/libsystem_c.dylib)
==18408==    by 0x2891E0: thread_start (in /usr/lib/system/libsystem_c.dylib)
==18408==  Address 0x1000257a8 is 8 bytes inside a block of size 32 free'd
==18408==    at 0x5632: free (in
/usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==18408==    by 0x1CAA12: emutls_destroy (in /usr/local/lib/libgcc_s.1.dylib)
==18408==    by 0x101: ???
==18408==    by 0xB0080E9F: ???
==18408==    by 0xB008186F: ???
==18408==    by 0x2A34DF: _pthread_tsd_cleanup (in
/usr/lib/system/libsystem_c.dylib)
==18408==    by 0xB008105F: ???

...


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2013-08-12 21:48 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-08-12 21:48 [Bug c++/58142] New: _pthread_tsd_cleanup called before destructors are called soonhok at cs dot cmu.edu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).