From c11bfa4217d84caace9a4ab570e3bca38586d5c9 Mon Sep 17 00:00:00 2001 From: Roberto Martin Fantini Date: Fri, 30 May 2025 11:24:37 +0200 Subject: [PATCH 1/3] Null dangling pointer for the case of pmap --- src/mfast/coder/decoder/fast_decoder.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mfast/coder/decoder/fast_decoder.cpp b/src/mfast/coder/decoder/fast_decoder.cpp index 68b21373..d757e059 100644 --- a/src/mfast/coder/decoder/fast_decoder.cpp +++ b/src/mfast/coder/decoder/fast_decoder.cpp @@ -290,6 +290,7 @@ message_type *fast_decoder_impl::decode_segment(fast_istreambuf &sb) { for (auto &&field : message->ref()) { apply_mutator(*this, field); } + this->current_ = nullptr; return message; } From 105757557abf0aad82b526612f84f81c66747b2b Mon Sep 17 00:00:00 2001 From: Roberto Martin Fantini Date: Fri, 30 May 2025 11:55:29 +0200 Subject: [PATCH 2/3] Correct enum code --- src/mfast/enum_ref.h | 10 ++++++++++ src/mfast/ext_ref.h | 2 -- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/mfast/enum_ref.h b/src/mfast/enum_ref.h index b1b4f99e..e12f763c 100644 --- a/src/mfast/enum_ref.h +++ b/src/mfast/enum_ref.h @@ -45,6 +45,15 @@ class MFAST_EXPORT enum_cref : public field_cref { } bool is_boolean() const; +protected: + friend class mfast::detail::codec_helper; + + void save_to(value_storage &v) const { + v.of_uint64.content_ = this->storage()->of_uint64.content_; + v.defined(true); + v.present(this->present()); + } + private: enum_cref &operator=(const enum_cref &); }; @@ -70,6 +79,7 @@ class enum_mref : public make_field_mref { enum_mref(const enum_mref &) = default; + explicit enum_mref(const field_mref_base &other) : base_type(other) {} void as(const enum_cref &cref) const { if (cref.absent()) { this->omit(); diff --git a/src/mfast/ext_ref.h b/src/mfast/ext_ref.h index cba11441..c4ef130b 100644 --- a/src/mfast/ext_ref.h +++ b/src/mfast/ext_ref.h @@ -250,12 +250,10 @@ class ext_mref : public ext_ref_properties { storage->present(true); } return mref_type(base_); - ; } cref_type get() const { return cref_type(base_); - ; } bool present() const { return !this->optional() || base_.present(); } From 4e3cb4d4af7fa57a19d086638fe4c714146e8027 Mon Sep 17 00:00:00 2001 From: Roberto Martin Fantini Date: Fri, 30 May 2025 11:56:14 +0200 Subject: [PATCH 3/3] add unit test for the enum case --- tests/CMakeLists.txt | 5 ++++- tests/enum_encoder_decoder.cpp | 19 +++++++++++++++++++ tests/enum_encoder_decoder_v2.cpp | 19 +++++++++++++++++++ tests/fast_test_coding_case.hpp | 2 +- tests/fast_test_coding_case_v2.hpp | 2 +- tests/simple16.xml | 21 +++++++++++++++++++++ 6 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 tests/enum_encoder_decoder.cpp create mode 100644 tests/enum_encoder_decoder_v2.cpp create mode 100644 tests/simple16.xml diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f4fe2e0b..2af8f927 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -24,7 +24,7 @@ FASTTYPEGEN_TARGET(simple_types12 simple12.xml) FASTTYPEGEN_TARGET(simple_types13 simple13.xml) FASTTYPEGEN_TARGET(simple_types14 simple14.xml) FASTTYPEGEN_TARGET(simple_types15 simple15.xml) - +FASTTYPEGEN_TARGET(simple_types16 simple16.xml) FASTTYPEGEN_TARGET(test_types1 test1.xml test2.xml) FASTTYPEGEN_TARGET(test_types3 test3.xml) @@ -70,6 +70,7 @@ add_executable (mfast_test ${FASTTYPEGEN_simple_types13_OUTPUTS} ${FASTTYPEGEN_simple_types14_OUTPUTS} ${FASTTYPEGEN_simple_types15_OUTPUTS} + ${FASTTYPEGEN_simple_types16_OUTPUTS} fast_type_gen_test.cpp dictionary_builder_test.cpp json_test.cpp @@ -82,6 +83,8 @@ add_executable (mfast_test scp_reset_test.cpp template_repo_base.cpp message_pmap_test.cpp + enum_encoder_decoder_v2.cpp + enum_encoder_decoder.cpp ) target_link_libraries (mfast_test diff --git a/tests/enum_encoder_decoder.cpp b/tests/enum_encoder_decoder.cpp new file mode 100644 index 00000000..9e89d59f --- /dev/null +++ b/tests/enum_encoder_decoder.cpp @@ -0,0 +1,19 @@ +#include "catch.hpp" +#include + +#include "fast_test_coding_case.hpp" +#include "byte_stream.h" + +#include "simple16.h" + +using namespace test::coding; + +TEST_CASE("enum test encoder/decoder","[enum_encoder_decoder]") +{ + fast_test_coding_case test_case; + simple16::Test_1 test_1; + simple16::Test_1_mref test_1_mref = test_1.mref(); + test_1_mref.set_discrete().as_Three(); + REQUIRE(test_case.encoding(test_1.cref(),"\xC0\x81\x83",true)); + REQUIRE(test_case.decoding("\xC0\x81\x83",test_1.cref(),true)); +} diff --git a/tests/enum_encoder_decoder_v2.cpp b/tests/enum_encoder_decoder_v2.cpp new file mode 100644 index 00000000..281a041a --- /dev/null +++ b/tests/enum_encoder_decoder_v2.cpp @@ -0,0 +1,19 @@ +#include "catch.hpp" +#include + +#include "fast_test_coding_case_v2.hpp" +#include "byte_stream.h" + +#include "simple16.h" + +using namespace test::coding; + +TEST_CASE("enum test encoder_V2/decoder_v2","[enum_encoder_v2_decoder_v2]") +{ + fast_test_coding_case_v2 test_case; + simple16::Test_1 test_1; + simple16::Test_1_mref test_1_mref = test_1.mref(); + test_1_mref.set_discrete().as_Three(); + REQUIRE(test_case.encoding(test_1.cref(),"\xC0\x81\x83",true)); + REQUIRE(test_case.decoding("\xC0\x81\x83",test_1.cref(),true)); +} diff --git a/tests/fast_test_coding_case.hpp b/tests/fast_test_coding_case.hpp index 0a70a07f..509d32b9 100644 --- a/tests/fast_test_coding_case.hpp +++ b/tests/fast_test_coding_case.hpp @@ -32,7 +32,7 @@ class fast_test_coding_case if (result == byte_stream(buffer, encoded_size)) return true; - INFO( "Got \"" << byte_stream(buffer, encoded_size) << "\" instead." ); + INFO( "Got \"" << byte_stream(buffer, encoded_size) << "\" instead." ); return false; } diff --git a/tests/fast_test_coding_case_v2.hpp b/tests/fast_test_coding_case_v2.hpp index 42dc0967..1e8bf49b 100644 --- a/tests/fast_test_coding_case_v2.hpp +++ b/tests/fast_test_coding_case_v2.hpp @@ -27,7 +27,7 @@ class fast_test_coding_case_v2 if (result == byte_stream(buffer, encoded_size)) return true; - INFO( "Got \"" << byte_stream(buffer, encoded_size) << "\" instead." ); + INFO( "Got \"" << byte_stream(buffer, encoded_size) << "\" instead." ); return false; } diff --git a/tests/simple16.xml b/tests/simple16.xml new file mode 100644 index 00000000..e32fafc2 --- /dev/null +++ b/tests/simple16.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + +