On 09/04/15 22:32, Larry Hall (Cygwin) wrote:
On 04/09/2015 04:15 AM, David Stacey wrote:

<snip>

I can't believe that I'm the first person to fall foul of this - any library
that relies heavily on templates risks falling into the same trap.

<snip>

It's true that someone using STL strings has the potential to see this bug but I doubt there are allot of template libraries out there pulling the same memory trick or doing so with the same catastrophic results.

It's going to affect all templates that have a static member variable, where an instantiation of said template is passed across a DLL boundary. Maybe there aren't too many of those.

In addition,
this is not the first time this has come up as an issue (for Cygwin or other
platforms) in one form or another.  Here's a good reference:

<https://gcc.gnu.org/bugzilla/show_bug.cgi?id=16612>

Wow - that was an interesting read, thank you! Obviously a different context, but most definitely the same problem. It looks as though I stumbled into a bear trap that's been around for at least ten years.

There they recommend the "--enable-fully-dynamic-string" flag as a solution for this particular problem but I agree if the "-frepo" will solve this as
well, it's better because it manages templates better overall and aligns
with Linux behavior.

I'm not sure I like '--enable-fully-dynamic-string', because it changes the API of std::string, and the two APIs are not interchangeable. So a library compiled with '--enable-fully-dynamic-string' can't be used with code that omitted that compiler option. You have to use it everywhere or not at all.

Poco is a network-centric library for other programmes to use. If I were to use '--enable-fully-dynamic-string' in compiling Poco then that would force users of the Poco library to use that compiler option too. And if, at the same time, they tried to link against another C++ API that wasn't built that way then the code wouldn't link - or if it did link it would crash when run.

So I either have to use '-frepo' or explicitly export the templates that Poco uses. '-frepo' might take longer to compile, and I suspect that it will force users of Poco to compile with '-frepo' as well. But it's guaranteed to catch other templates that I might have missed, and it will work with other C++ libraries that weren't built with '--enable-fully-dynamic-string'. So I'll stick with '-frepo'.

Anyway, thanks again for the link - interesting stuff.

Dave.


--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

Reply via email to