Do not take address of empty string front

François Dumont frs.dumont@gmail.com
Tue Jun 23 20:04:00 GMT 2015


On 22/06/2015 17:10, Jonathan Wakely wrote:
> 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;
>> +       }
>> +

Shouldn't it also set __count to 0 to make clear that nothing has been
converted.

>>      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.
>
Ok I will take care of this part.

François



More information about the Libstdc++ mailing list