On 8 May 2018 at 13:44, Stephan Bergmann wrote:
> 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.

This is only supported in very restricted cases.

> 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?

Yes, but my frank response is "don't do that".

The right fix here might be to ensure that _NFA always uses the
non-debug vector even in Debug Mode, but I'm fairly certain there are
other similar problems lurking.

Reply via email to