RFR 8218227 : StringBuilder constructor throws confusing NegativeArraySizeException

Roger Riggs Roger.Riggs at oracle.com
Tue Feb 5 14:29:56 UTC 2019


Hi Ivan,

ok, looks fine to me.

Thanks, Roger


On 02/04/2019 05:12 PM, Ivan Gerasimov wrote:
> The reason for keeping HugeCapacity separate was that they require 
> extra memory to be available, and they are skipped otherwise.
>
> And we want all "regular" Capacity tests to run always on all systems.
>
> With kind regards,
>
> Ivan
>
>
> On 2/4/19 1:39 PM, Roger Riggs wrote:
>> Hi Ivan,
>>
>> Can we put the new StringBuffer tests into the existing 
>> StringBuffer.Capacity.java test?
>> It can help keep functional test pieces to together and not create 
>> n+1 files.
>>
>> Looking back I would have preferred the same for the 
>> StringBuilder.Huge tests.
>> There is a Capacity.java test there too.  But the tests have diverged.
>>
>> Thanks, Roger
>>
>>
>> On 02/04/2019 04:25 PM, Ivan Gerasimov wrote:
>>> Thank you Roger for reviewing!
>>>
>>>
>>> On 2/4/19 11:32 AM, Roger Riggs wrote:
>>>> Hi Ivan,
>>>>
>>>> A good boundary condition to clean up.
>>>>
>>>> Should tests for StringBuffer be added too?
>>>>
>>> Yes, let's add them.
>>>
>>> Please find the updated webrev here:
>>> http://cr.openjdk.java.net/~igerasim/8218227/01/webrev/
>>>
>>> With kind regards,
>>> Ivan
>>>
>>>> Maxing out the length at MAX_VALUE must always result in an OOM.
>>>> If such an allocation were to succeed, it would violate the 
>>>> specified initial capacity requirement.
>>>>
>>>> Thanks, Roger
>>>>
>>>>
>>>> On 02/02/2019 02:28 AM, Ivan Gerasimov wrote:
>>>>> Hello!
>>>>>
>>>>> The spec of the constructors 
>>>>> StringBuilder(String)/StringBuilder(CharSequence) states that the 
>>>>> initial capacity of the builder will be set to the length of the 
>>>>> argument plus 16.
>>>>> This causes them to throw confusing NegativeArraySizeException 
>>>>> when the argument's length is close to Integer.MAX_VALUE.
>>>>>
>>>>> Let the arguments length be (Integer.MAX_VALUE - DELTA), like in 
>>>>> the code below:
>>>>>
>>>>>         String str = "Z".repeat(Integer.MAX_VALUE - DELTA);
>>>>>         StringBuilder sb = new StringBuilder(str);
>>>>>
>>>>> Currently the behavior is as following:
>>>>>     0 <= DELTA <= 2 - unable to construct str,
>>>>>     2 <= DELTA <= 15 - NegativeArraySizeException is thrown,
>>>>>     16 <= DELTA <= 17 - OutOfMemoryError is thrown,
>>>>>     DELTA >= 18 - works fine.
>>>>>
>>>>> With the fix, OOM will be thrown for all DELTA <= 17.
>>>>>
>>>>> Also the fix will make constructing a StringBuilder from UTF16 
>>>>> coded String slightly more efficient.
>>>>>
>>>>> BUGURL: https://bugs.openjdk.java.net/browse/JDK-8218227
>>>>> WEBREV: http://cr.openjdk.java.net/~igerasim/8218227/00/webrev/
>>>>>
>>>>> Would you please help review the fix?
>>>>>
>>>>
>>>>
>>>
>>
>



More information about the core-libs-dev mailing list