Skip to content

Commit c8cce21

Browse files
committed
Fix ParseInt1.js error
parseInt("4294967296") returned 1 due to strict aliasing bug at BigUInt.cpp:529. Fix LuHiDbl/LuLoDbl to prevent similar issues caused by them.
1 parent 5dcba40 commit c8cce21

File tree

2 files changed

+23
-13
lines changed

2 files changed

+23
-13
lines changed

lib/Common/Common/NumberUtilities.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ namespace Js
8484

8585
};
8686

87+
typedef uint32 uint32_aliased __attribute__((__may_alias__));
88+
typedef double double_aliased __attribute__((__may_alias__));
89+
8790
class NumberUtilities : public NumberUtilitiesBase
8891
{
8992
public:
@@ -92,8 +95,8 @@ namespace Js
9295
static uint32 MulLu(uint32 lu1, uint32 lu2, uint32 *pluHi);
9396
static int AddLu(uint32 *plu1, uint32 lu2);
9497

95-
static uint32 &LuHiDbl(double &dbl);
96-
static uint32 &LuLoDbl(double &dbl);
98+
static uint32_aliased &LuHiDbl(double_aliased &dbl);
99+
static uint32_aliased &LuLoDbl(double_aliased &dbl);
97100
static INT64 TryToInt64(double d);
98101
static bool IsValidTryToInt64(__int64 value); // Whether TryToInt64 resulted in a valid value.
99102

lib/Common/Common/NumberUtilities.inl

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,29 @@
5050

5151
namespace Js
5252
{
53-
NUMBER_UTIL_INLINE uint32 &NumberUtilities::LuHiDbl(double &dbl)
53+
union DoubleAccessor
5454
{
55+
double d;
56+
struct
57+
{
5558
#if defined(__BIG_ENDIAN__)
56-
return ((uint32 *)&dbl)[0];
57-
#else //!BIG_ENDIAN
58-
return ((uint32 *)&dbl)[1];
59-
#endif //!BIG_ENDIAN
59+
uint32 hi;
60+
uint32 lo;
61+
#else
62+
uint32 lo;
63+
uint32 hi;
64+
#endif
65+
} u;
66+
};
67+
68+
NUMBER_UTIL_INLINE uint32_aliased &NumberUtilities::LuHiDbl(double_aliased &dbl)
69+
{
70+
return reinterpret_cast<DoubleAccessor*>(&dbl)->u.hi;
6071
}
6172

62-
NUMBER_UTIL_INLINE uint32 &NumberUtilities::LuLoDbl(double &dbl)
73+
NUMBER_UTIL_INLINE uint32_aliased &NumberUtilities::LuLoDbl(double_aliased &dbl)
6374
{
64-
#if defined(__BIG_ENDIAN__)
65-
return ((uint32 *)&dbl)[1];
66-
#else //!BIG_ENDIAN
67-
return ((uint32 *)&dbl)[0];
68-
#endif //!BIG_ENDIAN
75+
return reinterpret_cast<DoubleAccessor*>(&dbl)->u.lo;
6976
}
7077

7178
#if defined(_M_X64) && defined(_MSC_VER) && !defined(__clang__)

0 commit comments

Comments
 (0)