From 0dd6231b3f360f9a6929af9f3ccc200fb0582146 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Wed, 23 Oct 2024 15:20:42 +0200 Subject: [PATCH] Forbid `deserializeJson(JsonArray|JsonObject, ...)` Closes #2135 --- CHANGELOG.md | 5 +++++ extras/tests/FailingBuilds/CMakeLists.txt | 3 +++ extras/tests/FailingBuilds/deserialize_object.cpp | 12 ++++++++++++ src/ArduinoJson/Deserialization/deserialize.hpp | 10 +++------- .../Polyfills/type_traits/integral_constant.hpp | 7 +++++-- 5 files changed, 28 insertions(+), 9 deletions(-) create mode 100644 extras/tests/FailingBuilds/deserialize_object.cpp diff --git a/CHANGELOG.md b/CHANGELOG.md index aaec5867..4f222fee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ ArduinoJson: change log ======================= +HEAD +---- + +* Forbid `deserializeJson(JsonArray|JsonObject, ...)` (issue #2135) + v7.2.0 (2024-09-18) ------ diff --git a/extras/tests/FailingBuilds/CMakeLists.txt b/extras/tests/FailingBuilds/CMakeLists.txt index 9a5f02cc..4c26477c 100644 --- a/extras/tests/FailingBuilds/CMakeLists.txt +++ b/extras/tests/FailingBuilds/CMakeLists.txt @@ -34,3 +34,6 @@ build_should_fail(variant_as_char) add_executable(assign_char assign_char.cpp) build_should_fail(assign_char) + +add_executable(deserialize_object deserialize_object.cpp) +build_should_fail(deserialize_object) diff --git a/extras/tests/FailingBuilds/deserialize_object.cpp b/extras/tests/FailingBuilds/deserialize_object.cpp new file mode 100644 index 00000000..04845cde --- /dev/null +++ b/extras/tests/FailingBuilds/deserialize_object.cpp @@ -0,0 +1,12 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2024, Benoit BLANCHON +// MIT License + +#include + +// See issue #2135 + +int main() { + JsonObject obj; + deserializeJson(obj, ""); +} diff --git a/src/ArduinoJson/Deserialization/deserialize.hpp b/src/ArduinoJson/Deserialization/deserialize.hpp index b33313e1..a95049a3 100644 --- a/src/ArduinoJson/Deserialization/deserialize.hpp +++ b/src/ArduinoJson/Deserialization/deserialize.hpp @@ -24,14 +24,10 @@ struct first_or_void { // A meta-function that returns true if T is a valid destination type for // deserialize() -template -struct is_deserialize_destination : false_type {}; - template -struct is_deserialize_destination< - T, enable_if_t())), - ResourceManager*>::value>> : true_type {}; +using is_deserialize_destination = + bool_constant>::value || + IsVariant::value>; template inline void shrinkJsonDocument(TDestination&) { diff --git a/src/ArduinoJson/Polyfills/type_traits/integral_constant.hpp b/src/ArduinoJson/Polyfills/type_traits/integral_constant.hpp index e1db890b..e263523d 100644 --- a/src/ArduinoJson/Polyfills/type_traits/integral_constant.hpp +++ b/src/ArduinoJson/Polyfills/type_traits/integral_constant.hpp @@ -13,7 +13,10 @@ struct integral_constant { static const T value = v; }; -typedef integral_constant true_type; -typedef integral_constant false_type; +template +using bool_constant = integral_constant; + +using true_type = bool_constant; +using false_type = bool_constant; ARDUINOJSON_END_PRIVATE_NAMESPACE