On Sat, 22 Apr 2023 01:26:08 GMT, Chen Liang <li...@openjdk.org> wrote:

>> @AlanBateman I would be happy to fill out the CSR, but unfortunately I don't 
>> think I am able to currently as I'm not an author on OpenJDK and as such 
>> don't have a JBS account. (I reported the bug through the Oracle site, 
>> rather than through bugs.openjdk.org .)
>> Would you be able to help out with this?
>
>> I would be happy to fill out the CSR, but unfortunately I don't think I am 
>> able to currently as I'm not an author on OpenJDK and as such don't have a 
>> JBS account. (I reported the bug through the Oracle site, rather than 
>> through bugs.openjdk.org .) Would you be able to help out with this?
> 
> You can provide text for the Summary, Problem, Solution, and Specification 
> parts of the CSR in this GitHub pull request, and I can help create a CSR for 
> you with your provided contents. See 
> https://wiki.openjdk.org/display/csr/Fields+of+a+CSR+Request
> 
>  - The Summary describes your CSR in a few concise sentences, like "Reject 
> interactions with Integer.MAX_VALUE bit in BitSet"
>  - The Problem is what prompts the CSR, for example, it may be 
> `BitSet.length()` may return a negative value when the `Integer.MAX_VALUE` 
> bit is set on a non-sticky-sized bitset, created either by setting 
> `Integer.MAX_VALUE` bit or passing in very huge buffer or arrays in `valueOf` 
> factories.
>  - The Solution is what resolves the problem described in this CSR, for 
> example, it may be that we explicitly reject interacting with 
> `Integer.MAX_VALUE` bit; and for array/buffer-initialized bitsets, we ignore 
> bits higher than or equal to `Integer.MAX_VALUE `(or throw an exception if 
> such an instance is attempted to be created), so we always have a nonnegative 
> int length().
>    - I personally recommend silently ignoring `Integer.MAX_VALUE` bit and 
> truncating everything else beyond than throwing, since currently, all bits 
> beyond are inaccessible due to rejection of negative indices
>  - The Specification is usually the Javadoc changes that describes these 
> behavior changes. For example, you may edit the specification of `length()` 
> to indicate it returns nonnegative; edit the specification of `valueOf()` to 
> indicate the bits higher than or equal to Integer.MAX_VALUE are ignored (or 
> throw an exception to prevent such creations); and edit the specification of 
> other methods `set` `get` etc. to reject `Integer.MAX_VALUE` as an inclusive 
> upper-bound by throwing an `IndexOutOfRangeException`.
>    - The specification changes is usually rendered as a git patch, so you can 
> just commit your code in this pr and I can generate a patch as specification 
> for you.
> 
> Also, you need to describe the compatibility risk: It should be "low", as 
> existing users that access `Integer.MAX_VALUE` bit will fail in all 
> non-sticky-sized modes. The changes to `valueOf` behavior (either silently 
> ignore `Integer.MAX_VALUE` bit or throwing) should be mentioned as well.

@liach Thanks for offering to help with the CSR.

Before we proceed with the CSR though, we need to decide what to do. I see the 
initial choice as: either (1) improve the behavior incrementally, by fixing 
get() for most bits other than the MAX_VALUE bit, and leaving other current 
misbehaviors as they are; or (2) pursue a comprehensive fix.

Note that (1) does not involve a spec change and thus doesn't require a CSR.

(2) will most likely change the spec and require a CSR. However, if we elect to 
pursue a comprehensive solution, there will need to be a design discussion. 
There are a large variety of approaches here. One is to reject setting of the 
MAX_VALUE bit along the lines of what @liach described above. A variation would 
be to have the rejection or noisy (i.e., throwing an exception). Still another 
possibility is to support setting and getting of all non-negative bits, with 
special-case behavior (e.g., returning MIN_VALUE in certain cases), and 
possibly also adding long-returning or -accepting APIs that provide sensible 
behaviors for the full range of bits.

There are also other possibilities, such as investigating sparse bitsets. That 
would be a big project, and would most likely involve investigating and doing 
something with external libraries such as [Roaring 
Bitmaps](https://roaringbitmap.org/). While interesting, I'd say that's out of 
scope for what started out as a simple bugfix.

What do you think?

-------------

PR Comment: https://git.openjdk.org/jdk/pull/13388#issuecomment-1518515543

Reply via email to