c++: Avoid UB in signed shift [PR 98625]
I'd forgotten that left shifting a negative value is UB until C++20. Insert some casts to do unsigned shifts. PT c++/98625 gcc/cp/ * module.cc (bytes_in::i, bytes_in::wi): Avoid left shift of signed type.
This commit is contained in:
parent
e140f5fd3e
commit
911f797a9b
1 changed files with 8 additions and 2 deletions
|
@ -878,9 +878,12 @@ bytes_in::i ()
|
|||
v &= 0xf;
|
||||
if (v & 0x8)
|
||||
v |= -1 ^ 0x7;
|
||||
/* unsigned necessary due to left shifts of -ve values. */
|
||||
unsigned uv = unsigned (v);
|
||||
if ((ptr = read (++bytes)))
|
||||
while (bytes--)
|
||||
v = (v << 8) | (*ptr++ & 0xff);
|
||||
uv = (uv << 8) | (*ptr++ & 0xff);
|
||||
v = int (uv);
|
||||
}
|
||||
else if (v & 0x40)
|
||||
v |= -1 ^ 0x3f;
|
||||
|
@ -969,9 +972,12 @@ bytes_in::wi ()
|
|||
v &= 0xf;
|
||||
if (v & 0x8)
|
||||
v |= -1 ^ 0x7;
|
||||
/* unsigned necessary due to left shifts of -ve values. */
|
||||
unsigned HOST_WIDE_INT uv = (unsigned HOST_WIDE_INT) v;
|
||||
if ((ptr = read (++bytes)))
|
||||
while (bytes--)
|
||||
v = (v << 8) | (*ptr++ & 0xff);
|
||||
uv = (uv << 8) | (*ptr++ & 0xff);
|
||||
v = (HOST_WIDE_INT) uv;
|
||||
}
|
||||
else if (v & 0x40)
|
||||
v |= -1 ^ 0x3f;
|
||||
|
|
Loading…
Add table
Reference in a new issue