From 32bd25055779c27269b196929e6d1436685f0455 Mon Sep 17 00:00:00 2001 From: Pierre Willenbrock Date: Mon, 9 Jan 2023 17:26:10 +0100 Subject: [PATCH 1/3] fix: Fix some memory leaks --- src/ConfigurationHelper.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/ConfigurationHelper.cpp b/src/ConfigurationHelper.cpp index 8cccec1..c143112 100644 --- a/src/ConfigurationHelper.cpp +++ b/src/ConfigurationHelper.cpp @@ -318,9 +318,9 @@ bool ConfigurationHelper::applyConfOnTyplibValue(Typelib::Value &value, const Co for(const std::shared_ptr val: array->getValues()) { - - //TODO check, this may be a memory leak - Typelib::Value v(new uint8_t[indirect.getSize()], indirect); + std::vector storage; + storage.resize(indirect.getSize()); + Typelib::Value v(storage.data(), indirect); Typelib::init(v); Typelib::zero(v); @@ -416,7 +416,10 @@ bool ConfigurationHelper::applyConfigValueOnDSB(RTT::base::DataSourceBase::share //write value back typelibTransport->writeDataSource(*dsb, handle); - + + //delete all referenced memory to avoid memory leak + Typelib::destroy(dest); + //destroy handle to avoid memory leak typelibTransport->deleteHandle(handle); From 106ee0f1f31071157f0fbf16e2b7086db1fa3813 Mon Sep 17 00:00:00 2001 From: Pierre Willenbrock Date: Thu, 15 Jan 2026 16:56:46 +0100 Subject: [PATCH 2/3] fix: Special case bool and (u)int8_t when writing config strings --- src/ConfigurationHelper.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/ConfigurationHelper.cpp b/src/ConfigurationHelper.cpp index c143112..bd475ba 100644 --- a/src/ConfigurationHelper.cpp +++ b/src/ConfigurationHelper.cpp @@ -557,7 +557,12 @@ bool ConfigurationHelper::registerOverride(const std::string& taskName, Configur } YAML::Emitter &toYAML(YAML::Emitter &out, const Typelib::Numeric &type, const Typelib::Value &value){ - + if (type.getName() == "/bool") + { + //the /bool type must be output as "true" or "false" + out << (*static_cast(value.getData())?"true":"false"); + return out; + } switch(type.getNumericCategory()) { case Typelib::Numeric::Float: @@ -574,7 +579,8 @@ YAML::Emitter &toYAML(YAML::Emitter &out, const Typelib::Numeric &type, const Ty switch(type.getSize()) { case sizeof(int8_t): - out << *(static_cast(value.getData())); + //need to cast uint8_t to int so it is not interpreted as character but as number + out << static_cast(*(static_cast(value.getData()))); break; case sizeof(int16_t): out << *(static_cast(value.getData())); @@ -596,7 +602,8 @@ YAML::Emitter &toYAML(YAML::Emitter &out, const Typelib::Numeric &type, const Ty switch(type.getSize()) { case sizeof(uint8_t): - out << *(static_cast(value.getData())); + //need to cast uint8_t to unsigned int so it is not interpreted as character but as number + out << static_cast(*(static_cast(value.getData()))); break; case sizeof(uint16_t): out << *(static_cast(value.getData())); From 9bd9ce86df14c3a37b77b5b6cfaad28450270585 Mon Sep 17 00:00:00 2001 From: Pierre Willenbrock Date: Thu, 15 Jan 2026 17:11:37 +0100 Subject: [PATCH 3/3] fix: No need to cast (u)int8_t to (u)int when finally casting to double --- src/TypeWrapper.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/TypeWrapper.cpp b/src/TypeWrapper.cpp index ed89242..a57c0af 100644 --- a/src/TypeWrapper.cpp +++ b/src/TypeWrapper.cpp @@ -93,7 +93,7 @@ double TypeWrapper::toDouble() { } case Typelib::Numeric::SInt: switch (numeric.getSize()) { - case sizeof(int8_t): return static_cast(*static_cast(value.getData())); + case sizeof(int8_t): return *static_cast(value.getData()); case sizeof(int16_t): return *static_cast(value.getData()); case sizeof(int32_t): return *static_cast(value.getData()); case sizeof(int64_t): return *static_cast(value.getData()); @@ -103,7 +103,7 @@ double TypeWrapper::toDouble() { } case Typelib::Numeric::UInt: { switch (numeric.getSize()) { - case sizeof(uint8_t): return static_cast(*static_cast(value.getData())); + case sizeof(uint8_t): return *static_cast(value.getData()); case sizeof(uint16_t): return *static_cast(value.getData()); case sizeof(uint32_t): return *static_cast(value.getData()); case sizeof(uint64_t): return *static_cast(value.getData());