[PATCH] PR libstdc++/86138 prevent implicit instantiation of COW empty rep

Jonathan Wakely jwakely@redhat.com
Wed Jun 27 00:12:00 GMT 2018


On 22/06/18 00:28 +0100, Jonathan Wakely wrote:
>The explicit instantiation declarations for std::basic_string are
>disabled for C++17 (and later) so that basic_string symbols get
>implicitly instantiated in every translation unit that needs them.  On
>targets that don't support STB_GNU_UNIQUE this leads to multiple copies
>of the empty rep symbol for COW strings. In order to detect whether a
>COW string needs to deallocate its storage it compares the address with
>the empty rep.  When there are multiple copies of the empty rep object
>the address is not unique, and so string destructors try to delete the
>empty rep, which crashes.
>
>In order to guarantee uniqueness of the _S_empty_rep_storage symbol this
>patch adds an explicit instantiation declaration for just that symbol.
>This means the other symbols are still implicitly instantiated in C++17
>code, but for the empty rep the definition in the library gets used.
>
>Separately, there is no need for C++17 code to implicitly instantiate
>the I/O functions for strings, so this also restores the explicit
>instantiation declarations for those functions.
>
>	PR libstdc++/86138
>	* include/bits/basic_string.tcc:
>	[__cplusplus > 201402 && !_GLIBCXX_USE_CXX11_ABI]
>	(basic_string<char>::_Rep::_S_empty_rep_storage)
>	(basic_string<wchar_t>::_Rep::_S_empty_rep_storage): Add explicit
>	instantiation declarations.
>	[__cplusplus > 201402] (operator>>, operator<<, getline): Re-enable
>	explicit instantiation declarations.
>	* testsuite/21_strings/basic_string/cons/char/86138.cc: New.
>	* testsuite/21_strings/basic_string/cons/wchar_t/86138.cc: New.
>
>Tested x86_64-linux, committed to trunk.
>
>If this passes testing on Cygwin I'll also backport it to gcc-7 and
>gcc-8, as the explicit instantiation declarations are disabled for
>C++17 on those branches.

The new tests are failing with _GLIBCXX_ASSERTIONS or _GLIBCXX_DEBUG
defined, because enabling assertions suppresses the explicit
instantiation declarations. However the COW empty reps and the I/O
functions don't contain any assertions, so don't need to be implicitly
instantiated.

Tested x86_64-linux, committed to trunk.



-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch.txt
Type: text/x-patch
Size: 2336 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20180627/83815b78/attachment.bin>


More information about the Gcc-patches mailing list