Do not take address of empty string front

Jonathan Wakely jwakely@redhat.com
Mon Jun 22 15:10:00 GMT 2015


On 20/06/15 12:59 +0100, Jonathan Wakely wrote:
>On 20/06/15 12:03 +0200, François Dumont wrote:
>>Hi
>>
>>   2 experimental tests are failing in debug mode because
>>__do_str_codecvt is sometimes taking address of string front() and
>>back() even if empty. It wasn't use so not a big issue but it still
>>seems better to avoid. I propose to rather use string begin() to get
>>buffer address.
>
>But derefencing begin() is still undefined for an empty string.
>Shouldn't that fail for debug mode too? Why change one form of
>undefined behaviour that we diagnose to another form that we don't
>diagnose?
>
>It would be better if that function didn't do any work when the input
>range is empty:
>
>--- a/libstdc++-v3/include/bits/locale_conv.h
>+++ b/libstdc++-v3/include/bits/locale_conv.h
>@@ -58,6 +58,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>                    _OutStr& __outstr, const _Codecvt& __cvt, _State& __state,
>                    size_t& __count, _Fn __fn)
>    {
>+      if (__first == __last)
>+       {
>+         __outstr.clear();
>+         return true;
>+       }
>+
>      size_t __outchars = 0;
>      auto __next = __first;
>      const auto __maxlen = __cvt.max_length() + 1;

This makes that change, and also moves wstring_convert into the
ABI-tagged __cxx11 namespace, and fixes a copy&paste error in the
exception thrown from wbuffer_convert.

Tested powerpc64le-linux, committed to trunk.

François, your changes to add extra checks in std::string are still
useful separately.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch.txt
Type: text/x-patch
Size: 1758 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20150622/91d1ff91/attachment.bin>


More information about the Libstdc++ mailing list