Merge pull request #1331 from JPEWdev/mem-alignment-fix
Fix SIGBUS due to unaligned access
This commit is contained in:
commit
6a905f9311
@ -269,16 +269,11 @@
|
|||||||
/*! \ingroup RAPIDJSON_CONFIG
|
/*! \ingroup RAPIDJSON_CONFIG
|
||||||
\param x pointer to align
|
\param x pointer to align
|
||||||
|
|
||||||
Some machines require strict data alignment. Currently the default uses 4 bytes
|
Some machines require strict data alignment. The default is 8 bytes.
|
||||||
alignment on 32-bit platforms and 8 bytes alignment for 64-bit platforms.
|
|
||||||
User can customize by defining the RAPIDJSON_ALIGN function macro.
|
User can customize by defining the RAPIDJSON_ALIGN function macro.
|
||||||
*/
|
*/
|
||||||
#ifndef RAPIDJSON_ALIGN
|
#ifndef RAPIDJSON_ALIGN
|
||||||
#if RAPIDJSON_64BIT == 1
|
#define RAPIDJSON_ALIGN(x) (((x) + static_cast<size_t>(7u)) & ~static_cast<size_t>(7u))
|
||||||
#define RAPIDJSON_ALIGN(x) (((x) + static_cast<uint64_t>(7u)) & ~static_cast<uint64_t>(7u))
|
|
||||||
#else
|
|
||||||
#define RAPIDJSON_ALIGN(x) (((x) + 3u) & ~3u)
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -63,7 +63,7 @@ TEST(Allocator, MemoryPoolAllocator) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST(Allocator, Alignment) {
|
TEST(Allocator, Alignment) {
|
||||||
#if RAPIDJSON_64BIT == 1
|
if (sizeof(size_t) >= 8) {
|
||||||
EXPECT_EQ(RAPIDJSON_UINT64_C2(0x00000000, 0x00000000), RAPIDJSON_ALIGN(0));
|
EXPECT_EQ(RAPIDJSON_UINT64_C2(0x00000000, 0x00000000), RAPIDJSON_ALIGN(0));
|
||||||
for (uint64_t i = 1; i < 8; i++) {
|
for (uint64_t i = 1; i < 8; i++) {
|
||||||
EXPECT_EQ(RAPIDJSON_UINT64_C2(0x00000000, 0x00000008), RAPIDJSON_ALIGN(i));
|
EXPECT_EQ(RAPIDJSON_UINT64_C2(0x00000000, 0x00000008), RAPIDJSON_ALIGN(i));
|
||||||
@ -71,15 +71,13 @@ TEST(Allocator, Alignment) {
|
|||||||
EXPECT_EQ(RAPIDJSON_UINT64_C2(0x00000001, 0x00000000), RAPIDJSON_ALIGN(RAPIDJSON_UINT64_C2(0x00000000, 0xFFFFFFF8) + i));
|
EXPECT_EQ(RAPIDJSON_UINT64_C2(0x00000001, 0x00000000), RAPIDJSON_ALIGN(RAPIDJSON_UINT64_C2(0x00000000, 0xFFFFFFF8) + i));
|
||||||
EXPECT_EQ(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFF8), RAPIDJSON_ALIGN(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFF0) + i));
|
EXPECT_EQ(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFF8), RAPIDJSON_ALIGN(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFF0) + i));
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
EXPECT_EQ(0u, RAPIDJSON_ALIGN(0u));
|
|
||||||
for (uint32_t i = 1; i < 4; i++) {
|
|
||||||
EXPECT_EQ(4u, RAPIDJSON_ALIGN(i));
|
|
||||||
EXPECT_EQ(8u, RAPIDJSON_ALIGN(4u + i));
|
|
||||||
EXPECT_EQ(0xFFFFFFF8u, RAPIDJSON_ALIGN(0xFFFFFFF4u + i));
|
|
||||||
EXPECT_EQ(0xFFFFFFFCu, RAPIDJSON_ALIGN(0xFFFFFFF8u + i));
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
EXPECT_EQ(0u, RAPIDJSON_ALIGN(0u));
|
||||||
|
for (uint32_t i = 1; i < 8; i++) {
|
||||||
|
EXPECT_EQ(8u, RAPIDJSON_ALIGN(i));
|
||||||
|
EXPECT_EQ(0xFFFFFFF8u, RAPIDJSON_ALIGN(0xFFFFFFF0u + i));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(Allocator, Issue399) {
|
TEST(Allocator, Issue399) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user