RFR: 5038439: Warning message for literal shift amounts outside the canonical domain [v5]
Joe Darcy
darcy at openjdk.org
Fri Nov 14 21:44:01 UTC 2025
On Fri, 14 Nov 2025 21:25:40 GMT, Archie Cobbs <acobbs at openjdk.org> wrote:
>> When bit shifting an `int` or `long` value by an amount `X`, all but the last 5 or 6 (respectively) bits of `X` are ignored.
>>
>> This can create a trap for the unwary, as in this example:
>>
>> public long readLongBigEndian(byte[] buf, int offset) {
>> return ((buf[offset + 0] & 0xff) << 56) // BUG HERE
>> | ((buf[offset + 1] & 0xff) << 48) // BUG HERE
>> | ((buf[offset + 2] & 0xff) << 40) // BUG HERE
>> | ((buf[offset + 3] & 0xff) << 32) // BUG HERE
>> | ((buf[offset + 4] & 0xff) << 24)
>> | ((buf[offset + 5] & 0xff) << 16)
>> | ((buf[offset + 6] & 0xff) << 8)
>> | ((buf[offset + 7] & 0xff);
>> }
>>
>> This PR adds a new warning when the compiler detects an out-of-range bit shift, i.e., an `int` bit shift not in the range `[-31...31]` or a `long` bit shift not in the range `[-63...63]`.
>
> Archie Cobbs has updated the pull request incrementally with one additional commit since the last revision:
>
> Add more verbosity to "lossy-conversions" description in @SuppressWarnings table.
Approving additional changes requested in CSR review.
-------------
Marked as reviewed by darcy (Reviewer).
PR Review: https://git.openjdk.org/jdk/pull/27102#pullrequestreview-3466929946
More information about the compiler-dev
mailing list