RFR: 8365163: [ubsan] left-shift issue in globalDefinitions.hpp
Andrew Haley
aph at openjdk.org
Sun Aug 17 08:45:11 UTC 2025
On Sun, 17 Aug 2025 06:49:47 GMT, Afshin Zafari <azafari at openjdk.org> wrote:
> There was a left-shift of negative value UB in `set_high` function where the high value sign bit is on and is left-shifted 32 bits to put it in high word of the destination address.
> To address it, first the left 32 bits of the provided `high` arg is cleared and then left-shifted 32 bits.
>
> Tests:
> mach5 tiers 1-5 {macosx-aarch64, linux-x64, windows-x64} x {debug, product}
src/hotspot/share/utilities/globalDefinitions.hpp line 1079:
> 1077: return result;
> 1078: }
> 1079:
This still has an overflowing left shift, and it's hard for the reader to follow.
I'd do something like this:
inline void set_low (jlong* value, jint low ) {
union {
jlong value_s;
julong value_u;
};
value_s = *value;
value_u = (value_u & ~(julong)0xffffffff) | (julong)low;
*value = value_s;
}
inline void set_high(jlong* value, jint high) {
union {
jlong value_s;
julong value_u;
};
value_s = *value;
value_u = (value_u & (julong)0xfffffffful) | ((julong)high << 32);
*value = value_s;
}
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/26809#discussion_r2280787149
More information about the hotspot-dev
mailing list