RFR 8218228 : The constructor StringBuffer(CharSequence) violates spec for negatively sized argument
Roger Riggs
Roger.Riggs at oracle.com
Tue Feb 12 15:33:49 UTC 2019
Hi Ivan,
The change to consistently throw NegativeSizeArrayException applies to
StringBuilder also.
Please mention that with the solution.
Thanks, Roger
On 02/11/2019 06:12 PM, Ivan Gerasimov wrote:
> Hi Roger!
>
>
> On 2/11/19 7:30 AM, Roger Riggs wrote:
>> Hi Ivan,
>>
>> I called it out because the CSR does not mention that the behavior
>> of some of the cases (-1..-16) is changing and some of the emails
>> asserted
>> there was no change in behavior.
>>
>> I'm fine with one changeset as long as both changes are explicit.
>> The bug and the CSR should both be updated.
>>
> Yes, this makes sense.
> I've updated CSR accordingly, and added a comment to the bug to make
> the intention of the fix clear.
>
> Could you please review the updated CSR?
>
> With kind regards,
> Ivan
>
>
>
>> Thanks, Roger
>>
>>
>> On 02/08/2019 05:12 PM, Ivan Gerasimov wrote:
>>> Hi Roger!
>>>
>>> That's because two tiny changes are combined in the patch:
>>>
>>> 1) remove a problematic statement from the javadoc, as it doesn't
>>> hold anyway. This part does not change the behavior.
>>>
>>> 2) unify type of the exception thrown for all negative values of
>>> CharSequence.length(). The regression test is to verify this,
>>> second change, so it fails prior the fix for length in [-16, -1].
>>>
>>> I can separate them into different bugs, if you think it will make
>>> it clearer. Though I thought they can be fixed together.
>>>
>>> With kind regards,
>>>
>>> Ivan
>>>
>>>
>>> On 2/8/19 1:49 PM, Roger Riggs wrote:
>>>> 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