8365163: [ubsan] left-shift issue in globalDefinitions.hpp

Reviewed-by: kbarrett, stefank, aph
This commit is contained in:
Afshin Zafari 2025-09-02 09:08:26 +00:00
parent 523bc77981
commit ef7872cc31
2 changed files with 31 additions and 12 deletions

View File

@ -641,19 +641,11 @@ inline jdouble jdouble_cast (jlong x) { return ((DoubleLongConv*)&x)->d; }
inline jint low (jlong value) { return jint(value); }
inline jint high(jlong value) { return jint(value >> 32); }
// the fancy casts are a hopefully portable way
// to do unsigned 32 to 64 bit type conversion
inline void set_low (jlong* value, jint low ) { *value &= (jlong)0xffffffff << 32;
*value |= (jlong)(julong)(juint)low; }
inline void set_high(jlong* value, jint high) { *value &= (jlong)(julong)(juint)0xffffffff;
*value |= (jlong)high << 32; }
inline jlong jlong_from(jint h, jint l) {
jlong result = 0; // initialization to avoid warning
set_high(&result, h);
set_low(&result, l);
return result;
// First cast jint values to juint, so cast to julong will zero-extend.
julong high = (julong)(juint)h << 32;
julong low = (julong)(juint)l;
return (jlong)(high | low);
}
union jlong_accessor {

View File

@ -295,3 +295,30 @@ TEST(globalDefinitions, format_specifiers) {
// Check all platforms print this compatibly without leading 0x.
check_format(UINT64_FORMAT_0, (u8)0x123, "0000000000000123");
}
TEST(globalDefinitions, jlong_from) {
jlong val = jlong_from(0xFF, 0);
EXPECT_EQ(val, CONST64(0x00000000FF00000000));
val = jlong_from(0, 0xFF);
EXPECT_EQ(val, CONST64(0x00000000000000FF));
val = jlong_from(0xFFFFFFFF, 0);
EXPECT_EQ((julong)val, UCONST64(0xFFFFFFFF00000000));
val = jlong_from(0, 0xFFFFFFFF);
EXPECT_EQ(val, CONST64(0x00000000FFFFFFFF));
val = jlong_from(0, -1);
EXPECT_EQ(val, CONST64(0x00000000FFFFFFFF));
val = jlong_from(-1, 0);
EXPECT_EQ((julong)val, UCONST64(0xFFFFFFFF00000000));
val = jlong_from(-1, -1);
EXPECT_EQ((julong)val, UCONST64(0xFFFFFFFFFFFFFFFF));
EXPECT_EQ(val, CONST64(-1));
val = jlong_from(0xABCD, 0xEFEF);
EXPECT_EQ(val, CONST64(0x0000ABCD0000EFEF));
}