[Bug target/101933] Unloaded dll with global std::mutex causes exe to crash on exit

2021-09-04 Thread mailnew4ster at gmail dot com via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101933

Paul Jackson  changed:

   What|Removed |Added

 Resolution|--- |INVALID
 Status|UNCONFIRMED |RESOLVED

--- Comment #4 from Paul Jackson  ---
I debugged it a bit more, and I found out that:
1. It's happening when exceptions are involved.
2. It's actually a bug of TDM-GCC.

For details, please see my second comment in the GitHub issue:
https://github.com/jmeubank/tdm-gcc/issues/38#issuecomment-912876481

[Bug target/101933] Unloaded dll with global std::mutex causes exe to crash on exit #38

2021-09-03 Thread mailnew4ster at gmail dot com via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101933

--- Comment #3 from Paul Jackson  ---
Maybe I'm missing something, but even this dll crashes for me now. So it seems
like it has nothing to do with global variables or static storage. That sucks,
it means that I just can't use C++ in dlls. Or is it? How come nobody noticed
it before?

I hope that I'm missing something here.

```
#include 

void x()
{
std::vector v;
v.push_back(2);
}
```

[Bug target/101933] Unloaded dll with global std::mutex causes exe to crash on exit #38

2021-09-03 Thread mailnew4ster at gmail dot com via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101933

--- Comment #2 from Paul Jackson  ---
I tried to work around the problem, and it's even worse than I expected. You
can replace dll.cc with the following and observe the same crash.

That means that even if I want to do manual memory management with raw
pointers, I can't. Please, consider fixing at least this.

```
#include 

struct {
std::vector v;
} *test;

void x()
{
if (test) {
test->v.push_back(2);
}
}
```

[Bug c++/101933] New: Unloaded dll with global std::mutex causes exe to crash on exit #38

2021-08-16 Thread mailnew4ster at gmail dot com via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101933

Bug ID: 101933
   Summary: Unloaded dll with global std::mutex causes exe to
crash on exit #38
   Product: gcc
   Version: unknown
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: c++
  Assignee: unassigned at gcc dot gnu.org
  Reporter: mailnew4ster at gmail dot com
  Target Milestone: ---

Reproduction on Windows:

Create and compile dll.cc as following:

```
#include 
std::mutex x;
```

g++.exe dll.cc -shared -o test.dll

Create and compile exe.cc as following:

```
#include 
int main()
{
auto x = LoadLibrary("test.dll");
MessageBox(0,0,0,0);
FreeLibrary(x);
MessageBox(0,0,0,0);
return 0;
}
```

g++.exe exe.cc -o test.exe

Run test.exe and observe a crash after seeing both message boxes.
The crash happens in msvcrt.doexit, which tries to call a cleanup function
inside the dll which was already freed.

I'm using TDM-GCC, and I also reported the issue there:
https://github.com/jmeubank/tdm-gcc/issues/38

I'm not sure whether it's specific to TDM-GCC, it applies some patches on GCC,
but they are very small and I think they probably don't affect this issue.