py/objfloat: Fix undefined shifting behavior in high-quality float hash.
When computing e.g. hash(0.4e3) with ubsan enabled, a diagnostic like the following would occur: ../../py/objfloat.c:91:30: runtime error: shift exponent 44 is too large for 32-bit type 'int' By casting constant "1" to the right type the intended value is preserved.
This commit is contained in:
parent
4f71a2a75a
commit
60eb5305f6
@ -88,7 +88,7 @@ typedef uint32_t mp_float_uint_t;
|
|||||||
if (adj_exp <= MP_FLOAT_FRAC_BITS) {
|
if (adj_exp <= MP_FLOAT_FRAC_BITS) {
|
||||||
// number may have a fraction; xor the integer part with the fractional part
|
// number may have a fraction; xor the integer part with the fractional part
|
||||||
val = (frc >> (MP_FLOAT_FRAC_BITS - adj_exp))
|
val = (frc >> (MP_FLOAT_FRAC_BITS - adj_exp))
|
||||||
^ (frc & ((1 << (MP_FLOAT_FRAC_BITS - adj_exp)) - 1));
|
^ (frc & (((mp_float_uint_t)1 << (MP_FLOAT_FRAC_BITS - adj_exp)) - 1));
|
||||||
} else if ((unsigned int)adj_exp < BITS_PER_BYTE * sizeof(mp_int_t) - 1) {
|
} else if ((unsigned int)adj_exp < BITS_PER_BYTE * sizeof(mp_int_t) - 1) {
|
||||||
// the number is a (big) whole integer and will fit in val's signed-width
|
// the number is a (big) whole integer and will fit in val's signed-width
|
||||||
val = (mp_int_t)frc << (adj_exp - MP_FLOAT_FRAC_BITS);
|
val = (mp_int_t)frc << (adj_exp - MP_FLOAT_FRAC_BITS);
|
||||||
|
Loading…
Reference in New Issue
Block a user