diff options
author | Lukas Larsson <[email protected]> | 2014-11-05 15:27:06 +0100 |
---|---|---|
committer | Lukas Larsson <[email protected]> | 2014-11-05 15:27:06 +0100 |
commit | 7513bb7670cf7081c4b70e240f99f9424b612f0b (patch) | |
tree | bc9aabb5e925541f41301a93d40bf11b00bfe533 /erts/emulator/beam/big.c | |
parent | 965187787f603181aadbe5effdbb8fa6dc90b9ac (diff) | |
parent | 16d8a6ce56fd066efa9ecb1d3fa3b3dab6d9613c (diff) | |
download | otp-7513bb7670cf7081c4b70e240f99f9424b612f0b.tar.gz otp-7513bb7670cf7081c4b70e240f99f9424b612f0b.tar.bz2 otp-7513bb7670cf7081c4b70e240f99f9424b612f0b.zip |
Merge branch 'lukas/erts/fix_undefined_behaviour/OTP-12290' into maint
* lukas/erts/fix_undefined_behaviour/OTP-12290:
erts: Fix ub in list_to_integer and bignum div
Diffstat (limited to 'erts/emulator/beam/big.c')
-rw-r--r-- | erts/emulator/beam/big.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/erts/emulator/beam/big.c b/erts/emulator/beam/big.c index a8710dd910..de7d370938 100644 --- a/erts/emulator/beam/big.c +++ b/erts/emulator/beam/big.c @@ -274,10 +274,9 @@ _b = _b << _s; \ _vn1 = _b >> H_EXP; \ _vn0 = _b & LO_MASK; \ - /* Sometimes _s is 0 which triggers undefined behaviour for the \ - (_a0>>(D_EXP-_s)) shift, but this is ok because the \ - & -s will make it all to 0 later anyways. */ \ - _un32 = (_a1 << _s) | ((_a0>>(D_EXP-_s)) & (-_s >> (D_EXP-1))); \ + /* If needed to avoid undefined behaviour */ \ + if (_s) _un32 = (_a1 << _s) | ((_a0>>(D_EXP-_s)) & (-_s >> (D_EXP-1))); \ + else _un32 = _a1; \ _un10 = _a0 << _s; \ _un1 = _un10 >> H_EXP; \ _un0 = _un10 & LO_MASK; \ |