RFR 8218228 : The constructor StringBuffer(CharSequence) violates spec for negatively sized argument
Roger Riggs
Roger.Riggs at oracle.com
Fri Feb 8 21:49:53 UTC 2019
Hi Ivan,
In the direction of not changing the behavior; the webrev does change
the behavior.
In the case of CharSeqence with length -1..-16, the new behavior throws
NegativeArrayIndexException
instead of java.lang.IndexOutOfBoundsException.
AbstractStringBuilder:101-102 throw an exception for length < 0.
However, the current behavior is to create a StringBuffer with length +
16 and
then append the contents. For -1..-16, it will succeed in creating a
StringBuffer
but fail with IndexOutOfBoundsException during the append of the contents.
The new Test should pass both before and after the change to the code.
Roger
On 02/07/2019 10:19 PM, Ivan Gerasimov wrote:
>
>
> On 2/7/19 6:33 PM, David Holmes wrote:
>> On 8/02/2019 11:59 am, Ivan Gerasimov wrote:
>>> Hi David!
>>>
>>>
>>> On 2/7/19 5:16 PM, David Holmes wrote:
>>>> Hi Ivan,
>>>>
>>>> On 8/02/2019 11:02 am, Ivan Gerasimov wrote:
>>>>> Hello!
>>>>>
>>>>> The specification states:
>>>>> """
>>>>> If the length of the specified CharSequence is less than or equal
>>>>> to zero, then an empty buffer of capacity 16 is returned.
>>>>> """
>>>>>
>>>>> However, the current implementation throws either
>>>>> NegativeArraySizeException or IndexOutOfBounds instead (the actual
>>>>> exception type depends on the value of reported negative length).
>>>>
>>>> How can you have a negative length CharSequence ??
>>>>
>>> A custom CharSequence returning negative length() can be created.
>>> Not sure how useful/popular this may be, though.
>>
>> Seems pretty meaningless so just treating that as an error seems
>> fine. Though somewhat debatable whether you need to add an
>> appropriate @throws.
>>
> Right. There were two reasons not to add @throws here:
> - by removing the problematic paragraph we just make the javadoc
> almost the same as for StringBuilder(CharSequence),
> - we don't seem to have any other places (at least I couldn't find
> any) specifying exceptions due to negatively sized CharSequence.
>
> (To be precise, there is one candidate, but I'll file a separate bug
> to fix it.)
>
>>> That's why I propose just removing the mentioning negative length,
>>> and not changing the behavior.
>>>
>>> The proposed code change is to only unify the behavior for any
>>> negative value of length.
>>
>> Ok.
>>
>>>> If its an empty CharSequence then it should return the empty buffer
>>>> as indicated.
>>>>
>>> Empty CharSequence is processed correctly already.
>>
>> Okay so by removing this part:
>>
>> - * <p>
>> - * If the length of the specified {@code CharSequence} is
>> - * less than or equal to zero, then an empty buffer of capacity
>> - * {@code 16} is returned.
>>
>> you're relying on the main specification to implicitly handle the
>> empty case.
>>
> Yes.
>
> With kind regards,
> Ivan
>
>
>> David
>> -----
>>
>>> With kind regards,
>>> Ivan
>>>
>>>> Cheers,
>>>> David
>>>>
>>>>> It is proposed to do two things:
>>>>> 1) remove the problematic sentence from the javadoc (CSR is filed).
>>>>> 2) unify the exception type thrown, if the argument reports
>>>>> negative length.
>>>>> NegativeArraySizeException will be consistent with, for example,
>>>>> StringBuffer(negativeCapacity).
>>>>>
>>>>> Would you please help review the fix?
>>>>>
>>>>> BUGURL: https://bugs.openjdk.java.net/browse/JDK-8218228
>>>>> WEBREV: http://cr.openjdk.java.net/~igerasim/8218228/00/webrev/
>>>>> CRS: https://bugs.openjdk.java.net/browse/JDK-8218649
>>>>>
>>>>
>>>
>>
>
More information about the core-libs-dev
mailing list