I was recently bitten by the following issue (Linux, libstdc++ 8.0.1):
A process loads two dynamic libraries A and B both using std::regex, and
A is compiled without -D_GLIBCXX_DEBUG while B is compiled with
-D_GLIBCXX_DEBUG. B creates an instance of std::regex, which internally
creates a
std::shared_ptr<std::__detail::_NFA<std::__cxx11::regex_traits<char>>>,
where _NFA has various members of std::__debug::vector type (but which
isn't reflected in the mangled name of that _NFA instantiation itself).
Now, when that instance of std::regex is destroyed again in library B,
the
std::shared_ptr<std::__detail::_NFA<std::__cxx11::regex_traits<char>>>::~shared_ptr
destructor (and functions it in turn calls) that happens to get picked
is the (inlined, and exported due to default visibility) instance from
library A. And that assumes that that _NFA instantiation has members of
non-debug std::vector type, which causes a crash.
Should it be considered a bug that such mixture of debug and non-debug
std::regex usage causes ODR violations?
- libstdc++: ODR violation when using std::regex with and w... Stephan Bergmann
-