From 28836b8acc2c002b0488c13dba28fd5be864970a Mon Sep 17 00:00:00 2001 From: Christopher Dunn Date: Sat, 5 Jul 2014 13:52:19 -0700 Subject: [PATCH] fix bug for static init Ugh! Static initialization of instance variables is a very bad idea. This fix is taken from the Chromium code-base. It includes their double-fix for ARM. * https://codereview.chromium.org/24984004 * https://src.chromium.org/viewvc/chrome?revision=226099&view=revision * https://code.google.com/p/webrtc/issues/detail?id=1777 --- include/json/value.h | 2 +- src/lib_json/json_value.cpp | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/json/value.h b/include/json/value.h index 92526a4..1ad006f 100644 --- a/include/json/value.h +++ b/include/json/value.h @@ -133,7 +133,7 @@ public: typedef Json::LargestUInt LargestUInt; typedef Json::ArrayIndex ArrayIndex; - static const Value null; + static const Value& null; /// Minimum signed integer value that can be stored in a Json::Value. static const LargestInt minLargestInt; /// Maximum signed integer value that can be stored in a Json::Value. diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp index 29380e1..5e78065 100644 --- a/src/lib_json/json_value.cpp +++ b/src/lib_json/json_value.cpp @@ -25,7 +25,17 @@ namespace Json { -const Value Value::null; +// This is a walkaround to avoid the static initialization of Value::null. +// kNull must be word-aligned to avoid crashing on ARM. We use an alignment of +// 8 (instead of 4) as a bit of future-proofing. +#if defined(__ARMEL__) +#define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment))) +#else +#define ALIGNAS(byte_alignment) +#endif +static const unsigned char ALIGNAS(8) kNull[sizeof(Value)] = {0}; +const Value& Value::null = reinterpret_cast(kNull); + const Int Value::minInt = Int(~(UInt(-1) / 2)); const Int Value::maxInt = Int(UInt(-1) / 2); const UInt Value::maxUInt = UInt(-1);