From bd5653f959e7ed5e29796071f54f3bdb1b77fdd3 Mon Sep 17 00:00:00 2001 From: Oleg Smolsky Date: Wed, 22 Apr 2020 15:17:35 -0700 Subject: [PATCH 1/2] Correct object copying in document.h - this came up when building the code with GCC9 + copying C++ objects with memcpy() is only permitted for Trivial types, the rest should be copied via copy or assignment + tweaked the code to construct the objects in place and then assign Ran "make test", looks OK. --- include/rapidjson/document.h | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/include/rapidjson/document.h b/include/rapidjson/document.h index 68aaae7e6..ce8b46edb 100644 --- a/include/rapidjson/document.h +++ b/include/rapidjson/document.h @@ -22,6 +22,8 @@ #include "internal/strfunc.h" #include "memorystream.h" #include "encodedstream.h" + +#include #include // placement new #include #ifdef __cpp_lib_three_way_comparison @@ -110,6 +112,9 @@ class GenericDocument; template class GenericMember { public: + // Allow default construction as it is needed during copying. + GenericMember() = default; + GenericValue name; //!< name of member (must be a string) GenericValue value; //!< value of member. @@ -2113,9 +2118,11 @@ class GenericValue { void SetArrayRaw(GenericValue* values, SizeType count, Allocator& allocator) { data_.f.flags = kArrayFlag; if (count) { - GenericValue* e = static_cast(allocator.Malloc(count * sizeof(GenericValue))); - SetElementsPointer(e); - std::memcpy(static_cast(e), values, count * sizeof(GenericValue)); + auto arr = static_cast(allocator.Malloc(count * sizeof(GenericValue))); + for (SizeType idx = 0; idx < count; ++idx) + new (arr + idx) GenericValue; + SetElementsPointer(arr); + std::copy_n(values, count, arr); } else SetElementsPointer(0); @@ -2126,9 +2133,11 @@ class GenericValue { void SetObjectRaw(Member* members, SizeType count, Allocator& allocator) { data_.f.flags = kObjectFlag; if (count) { - Member* m = static_cast(allocator.Malloc(count * sizeof(Member))); - SetMembersPointer(m); - std::memcpy(static_cast(m), members, count * sizeof(Member)); + auto arr = static_cast(allocator.Malloc(count * sizeof(Member))); + for (SizeType idx = 0; idx < count; ++idx) + new (arr + idx) Member; + SetMembersPointer(arr); + std::copy_n(members, count, arr); } else SetMembersPointer(0); From 6c812e04d489cdb9fc61ed7c1e96f567dea52202 Mon Sep 17 00:00:00 2001 From: Oleg Smolsky Date: Wed, 22 Apr 2020 19:28:22 -0700 Subject: [PATCH 2/2] C++03 --- include/rapidjson/document.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/rapidjson/document.h b/include/rapidjson/document.h index ce8b46edb..0c562506a 100644 --- a/include/rapidjson/document.h +++ b/include/rapidjson/document.h @@ -113,7 +113,7 @@ template class GenericMember { public: // Allow default construction as it is needed during copying. - GenericMember() = default; + GenericMember() {} GenericValue name; //!< name of member (must be a string) GenericValue value; //!< value of member.