google / googletest

GoogleTest - Google Testing and Mocking Framework
https://google.github.io/googletest/
BSD 3-Clause "New" or "Revised" License
33.7k stars 9.98k forks source link

[Bug]: A race condition exist between the Watcher thread and the main thread terminating. #4493

Closed cgyrling closed 3 months ago

cgyrling commented 3 months ago

Describe the issue

A race condition exist between the Watcher thread and main(). A case was found where the Watcher thread does not get execution time before the main function returns and calls atexit(). At that point the Watcher thread started runing tls_init() code while the main thread was shutting down. This resulted in rare crashes and deadlocks.

Steps to reproduce the problem

As this is a race condition, it is tricky to reproduce. The easiest way is to do the following. 1) Add SCOPED_TRACE right before returning from GTest. 2) Add a thread_local instance of a class that is accessing a static shared_ptr. The shared pointer gets cleaned up on 'atexit' and if you access that via your constructor in the call from tls_init(), it will access freed memory.

What version of GoogleTest are you using?

1.14.0

What operating system and version are you using?

Windows 10

What compiler and version are you using?

msc / Visual Studio 2022

What build system are you using?

buck

Additional context

No response