libstdc++: ODR violation when using std::regex with and without -D_GLIBCXX_DEBUG

Stephan Bergmann sbergman@redhat.com
Tue May 8 12:44:00 GMT 2018


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?



More information about the Gcc mailing list