aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/big.h
diff options
context:
space:
mode:
authorLukas Larsson <[email protected]>2014-08-04 12:04:45 +0200
committerLukas Larsson <[email protected]>2014-08-08 17:17:18 +0200
commit9d3c22934491afe85fbcf8543ae43fb2eb1ab387 (patch)
tree4cfbd2f87d60b7a143426140984a3ae0b93d9252 /erts/emulator/beam/big.h
parent62081266545df8f5eda8e2043f33055cfe575126 (diff)
downloadotp-9d3c22934491afe85fbcf8543ae43fb2eb1ab387.tar.gz
otp-9d3c22934491afe85fbcf8543ae43fb2eb1ab387.tar.bz2
otp-9d3c22934491afe85fbcf8543ae43fb2eb1ab387.zip
erts: Fix neg int overflow when sint is min size
When INT64_MIN is the value of a Sint64 we have to first cast it to an Uint64 before negating it. Otherwise we get an integer overflow which is undefined behaviour and in gcc 4.9 this results in -0 instead of -9223372036854775808 in gcc 4.8.
Diffstat (limited to 'erts/emulator/beam/big.h')
-rw-r--r--erts/emulator/beam/big.h2
1 files changed, 1 insertions, 1 deletions
diff --git a/erts/emulator/beam/big.h b/erts/emulator/beam/big.h
index d80111822e..da31876d75 100644
--- a/erts/emulator/beam/big.h
+++ b/erts/emulator/beam/big.h
@@ -101,7 +101,7 @@ typedef Uint dsize_t; /* Vector size type */
#define ERTS_SINT64_HEAP_SIZE(X) \
(IS_SSMALL((X)) \
? 0 \
- : ERTS_UINT64_BIG_HEAP_SIZE__((X) >= 0 ? (X) : -(X)))
+ : ERTS_UINT64_BIG_HEAP_SIZE__((X) >= 0 ? (X) : -(Uint64)(X)))
#define ERTS_UINT64_HEAP_SIZE(X) \
(IS_USMALL(0, (X)) ? 0 : ERTS_UINT64_BIG_HEAP_SIZE__((X)))