From d434a88648c3e1b59eee7c817df95f14b75bcf56 Mon Sep 17 00:00:00 2001 From: Martijn Reicher Date: Wed, 27 Sep 2023 11:44:48 +0200 Subject: [PATCH 1/4] Fixes for coverity issue fun_call_w_exception Added try/catch blocks around the code in the example programs Signed-off-by: Martijn Reicher --- examples/roundtrip/ping.cpp | 163 +++++++++++++++-------------- examples/roundtrip/pong.cpp | 125 ++++++++++++---------- examples/throughput/publisher.cpp | 63 ++++++----- examples/throughput/subscriber.cpp | 72 +++++++------ 4 files changed, 233 insertions(+), 190 deletions(-) diff --git a/examples/roundtrip/ping.cpp b/examples/roundtrip/ping.cpp index b9e52f43..f72c976e 100644 --- a/examples/roundtrip/ping.cpp +++ b/examples/roundtrip/ping.cpp @@ -210,103 +210,114 @@ static bool parse_args(int argc, char *argv[]) int main (int argc, char *argv[]) { - /* Register handler for Ctrl-C */ - signal (SIGINT, sigint); + try { + /* Register handler for Ctrl-C */ + signal (SIGINT, sigint); - if (!parse_args(argc, argv)) { - print_usage(); - return EXIT_FAILURE; - } + if (!parse_args(argc, argv)) { + print_usage(); + return EXIT_FAILURE; + } - dds::domain::DomainParticipant participant(domain::default_id()); + dds::domain::DomainParticipant participant(domain::default_id()); - dds::topic::qos::TopicQos tqos; - tqos << dds::core::policy::Reliability::Reliable(dds::core::Duration::from_secs(10)); + dds::topic::qos::TopicQos tqos; + tqos << dds::core::policy::Reliability::Reliable(dds::core::Duration::from_secs(10)); - dds::topic::Topic topic(participant, "RoundTrip", tqos); + dds::topic::Topic topic(participant, "RoundTrip", tqos); - dds::pub::qos::PublisherQos pqos; - pqos << dds::core::policy::Partition("ping"); + dds::pub::qos::PublisherQos pqos; + pqos << dds::core::policy::Partition("ping"); - dds::pub::Publisher publisher(participant, pqos); + dds::pub::Publisher publisher(participant, pqos); - dds::pub::qos::DataWriterQos wqos; - wqos << dds::core::policy::WriterDataLifecycle::ManuallyDisposeUnregisteredInstances(); + dds::pub::qos::DataWriterQos wqos; + wqos << dds::core::policy::WriterDataLifecycle::ManuallyDisposeUnregisteredInstances(); - dds::pub::DataWriter writer(publisher, topic, wqos); + dds::pub::DataWriter writer(publisher, topic, wqos); - dds::sub::qos::SubscriberQos sqos; - sqos << dds::core::policy::Partition("pong"); + dds::sub::qos::SubscriberQos sqos; + sqos << dds::core::policy::Partition("pong"); - dds::sub::Subscriber subscriber(participant, sqos); + dds::sub::Subscriber subscriber(participant, sqos); - RoundTripListener listener(writer, &data_available); + RoundTripListener listener(writer, &data_available); - RoundTripListener *list = use_listener ? &listener : nullptr; - dds::sub::DataReader - reader( - subscriber, - topic, - dds::sub::qos::DataReaderQos(), - list, - use_listener ? dds::core::status::StatusMask::data_available() : dds::core::status::StatusMask::none()); + RoundTripListener *list = use_listener ? &listener : nullptr; + dds::sub::DataReader + reader( + subscriber, + topic, + dds::sub::qos::DataReaderQos(), + list, + use_listener ? dds::core::status::StatusMask::data_available() : dds::core::status::StatusMask::none()); - dds::core::Duration waittime = timeOut ? - dds::core::Duration::from_secs(static_cast(timeOut)) : - dds::core::Duration::infinite(); - if (!match_readers_and_writers(reader, writer, waittime)) { - return EXIT_FAILURE; - } + dds::core::Duration waittime = timeOut ? + dds::core::Duration::from_secs(static_cast(timeOut)) : + dds::core::Duration::infinite(); + if (!match_readers_and_writers(reader, writer, waittime)) { + return EXIT_FAILURE; + } - roundtrip_msg.payload(std::vector(payloadSize, 'a')); + roundtrip_msg.payload(std::vector(payloadSize, 'a')); - startTime = dds_time (); - preWriteTime = dds_time (); + startTime = dds_time (); + preWriteTime = dds_time (); - //starting write - writer.write(roundtrip_msg); - if (sendTerm) { - std::cout << "# Sending termination command to pong program\n" << std::flush; - writer.dispose_instance(roundtrip_msg); - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - return EXIT_FAILURE; - } - - printf ("# Waiting for startup jitter to stabilise\n"); - if (use_listener) { - while (!timedOut && !done && (!numSamples || elapsed < numSamples)) { - timedOut = (timeOut != 0); - std::this_thread::sleep_for(std::chrono::seconds(timeOut ? timeOut : 1)); + //starting write + writer.write(roundtrip_msg); + if (sendTerm) { + std::cout << "# Sending termination command to pong program\n" << std::flush; + writer.dispose_instance(roundtrip_msg); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + return EXIT_FAILURE; } - } else { - dds::core::cond::WaitSet waitset; - - dds::core::cond::StatusCondition rsc(reader); - rsc.enabled_statuses(dds::core::status::StatusMask::data_available()); - waitset.attach_condition(rsc); - - while (!timedOut && !done && (!numSamples || elapsed < numSamples)) { - try { - waitset.wait(waittime); - } catch (const dds::core::TimeoutError &) { - std::cout << "\n# Timeout occurred.\n" << std::flush; - timedOut = true; - break; - } catch (const dds::core::Exception &e) { - std::cout << "\n# Ping encountered the following error: \"" << e.what() << "\".\n" << std::flush; + + printf ("# Waiting for startup jitter to stabilise\n"); + if (use_listener) { + while (!timedOut && !done && (!numSamples || elapsed < numSamples)) { + timedOut = (timeOut != 0); + std::this_thread::sleep_for(std::chrono::seconds(timeOut ? timeOut : 1)); + } + } else { + dds::core::cond::WaitSet waitset; + + dds::core::cond::StatusCondition rsc(reader); + rsc.enabled_statuses(dds::core::status::StatusMask::data_available()); + waitset.attach_condition(rsc); + + while (!timedOut && !done && (!numSamples || elapsed < numSamples)) { + try { + waitset.wait(waittime); + } catch (const dds::core::TimeoutError &) { + std::cout << "\n# Timeout occurred.\n" << std::flush; + timedOut = true; + break; + } catch (const dds::core::Exception &e) { + std::cout << "\n# Ping encountered the following error: \"" << e.what() << "\".\n" << std::flush; + done = true; + } catch (...) { + std::cout << "\n# Ping encountered an error.\n" << std::flush; done = true; - } catch (...) { - std::cout << "\n# Ping encountered an error.\n" << std::flush; - done = true; + } + (void) data_available(reader, writer); } - (void) data_available(reader, writer); } - } - if (!warmUp) - { - std::cout << "# Overall" << std::flush; - print_all(roundTripOverall, writeAccessOverall, readAccessOverall); + if (!warmUp) + { + std::cout << "# Overall" << std::flush; + print_all(roundTripOverall, writeAccessOverall, readAccessOverall); + } + } catch (const dds::core::Exception& e) { + std::cerr << "# DDS exception: " << e.what() << std::endl; + return EXIT_FAILURE; + } catch (const std::exception& e) { + std::cerr << "# C++ exception: " << e.what() << std::endl; + return EXIT_FAILURE; + } catch (...) { + std::cerr << "# Generic exception" << std::endl; + return EXIT_FAILURE; } return EXIT_SUCCESS; diff --git a/examples/roundtrip/pong.cpp b/examples/roundtrip/pong.cpp index f10175a2..7f58d2d8 100644 --- a/examples/roundtrip/pong.cpp +++ b/examples/roundtrip/pong.cpp @@ -93,79 +93,90 @@ static bool data_available(dds::sub::DataReader& rd, int main (int argc, char *argv[]) { - signal (SIGINT, sigint); + try { + signal (SIGINT, sigint); - if (!parse_args(argc, argv)) { - print_usage(); - return EXIT_SUCCESS; - } + if (!parse_args(argc, argv)) { + print_usage(); + return EXIT_SUCCESS; + } - dds::domain::DomainParticipant participant(domain::default_id()); + dds::domain::DomainParticipant participant(domain::default_id()); - dds::topic::qos::TopicQos tqos; - tqos << dds::core::policy::Reliability::Reliable(dds::core::Duration::from_secs(10)); + dds::topic::qos::TopicQos tqos; + tqos << dds::core::policy::Reliability::Reliable(dds::core::Duration::from_secs(10)); - dds::topic::Topic topic(participant, "RoundTrip", tqos); + dds::topic::Topic topic(participant, "RoundTrip", tqos); - dds::pub::qos::PublisherQos pqos; - pqos << dds::core::policy::Partition("pong"); + dds::pub::qos::PublisherQos pqos; + pqos << dds::core::policy::Partition("pong"); - dds::pub::Publisher publisher(participant, pqos); + dds::pub::Publisher publisher(participant, pqos); - dds::pub::qos::DataWriterQos wqos; - wqos << dds::core::policy::WriterDataLifecycle::ManuallyDisposeUnregisteredInstances(); + dds::pub::qos::DataWriterQos wqos; + wqos << dds::core::policy::WriterDataLifecycle::ManuallyDisposeUnregisteredInstances(); - dds::pub::DataWriter writer(publisher, topic, wqos); + dds::pub::DataWriter writer(publisher, topic, wqos); - dds::sub::qos::SubscriberQos sqos; - sqos << dds::core::policy::Partition("ping"); + dds::sub::qos::SubscriberQos sqos; + sqos << dds::core::policy::Partition("ping"); - dds::sub::Subscriber subscriber(participant, sqos); + dds::sub::Subscriber subscriber(participant, sqos); - RoundTripListener listener(writer, &data_available); + RoundTripListener listener(writer, &data_available); - RoundTripListener *list = use_listener ? &listener : nullptr; - dds::sub::DataReader - reader( - subscriber, - topic, - dds::sub::qos::DataReaderQos(), - list, - use_listener ? dds::core::status::StatusMask::data_available() : dds::core::status::StatusMask::none()); + RoundTripListener *list = use_listener ? &listener : nullptr; + dds::sub::DataReader + reader( + subscriber, + topic, + dds::sub::qos::DataReaderQos(), + list, + use_listener ? dds::core::status::StatusMask::data_available() : dds::core::status::StatusMask::none()); - dds::core::Duration waittime = timeOut ? - dds::core::Duration::from_secs(static_cast(timeOut)) : - dds::core::Duration::infinite(); - if (!match_readers_and_writers(reader, writer, waittime)) - return EXIT_FAILURE; + dds::core::Duration waittime = timeOut ? + dds::core::Duration::from_secs(static_cast(timeOut)) : + dds::core::Duration::infinite(); + if (!match_readers_and_writers(reader, writer, waittime)) + return EXIT_FAILURE; - if (use_listener) { - while (!timedOut && !done) { - timedOut = (timeOut != 0); - std::this_thread::sleep_for(std::chrono::seconds(timeOut ? timeOut : 1)); - } - } else { - dds::core::cond::WaitSet waitset; - - dds::core::cond::StatusCondition rsc(reader); - rsc.enabled_statuses(dds::core::status::StatusMask::data_available()); - waitset.attach_condition(rsc); - - while (!timedOut && !done) { - try { - waitset.wait(waittime); - } catch (const dds::core::TimeoutError &) { - std::cout << "\n# Timeout occurred.\n" << std::flush; - return EXIT_FAILURE; - } catch (const dds::core::Exception &e) { - std::cout << "\n# Pong encountered the following error: \"" << e.what() << "\".\n" << std::flush; - return EXIT_FAILURE; - } catch (...) { - std::cout << "\n# Pong encountered an error.\n" << std::flush; - return EXIT_FAILURE; + if (use_listener) { + while (!timedOut && !done) { + timedOut = (timeOut != 0); + std::this_thread::sleep_for(std::chrono::seconds(timeOut ? timeOut : 1)); + } + } else { + dds::core::cond::WaitSet waitset; + + dds::core::cond::StatusCondition rsc(reader); + rsc.enabled_statuses(dds::core::status::StatusMask::data_available()); + waitset.attach_condition(rsc); + + while (!timedOut && !done) { + try { + waitset.wait(waittime); + } catch (const dds::core::TimeoutError &) { + std::cout << "\n# Timeout occurred.\n" << std::flush; + return EXIT_FAILURE; + } catch (const dds::core::Exception &e) { + std::cout << "\n# Pong encountered the following error: \"" << e.what() << "\".\n" << std::flush; + return EXIT_FAILURE; + } catch (...) { + std::cout << "\n# Pong encountered an error.\n" << std::flush; + return EXIT_FAILURE; + } + (void) data_available(reader, writer); } - (void) data_available(reader, writer); } + } catch (const dds::core::Exception& e) { + std::cerr << "# DDS exception: " << e.what() << std::endl; + return EXIT_FAILURE; + } catch (const std::exception& e) { + std::cerr << "# C++ exception: " << e.what() << std::endl; + return EXIT_FAILURE; + } catch (...) { + std::cerr << "# Generic exception" << std::endl; + return EXIT_FAILURE; } return EXIT_SUCCESS; diff --git a/examples/throughput/publisher.cpp b/examples/throughput/publisher.cpp index 154bceba..1e14cd33 100644 --- a/examples/throughput/publisher.cpp +++ b/examples/throughput/publisher.cpp @@ -170,45 +170,56 @@ void start_writing( int main (int argc, char **argv) { - ThroughputModule::DataType sample; + try { + ThroughputModule::DataType sample; - if (parse_args(argc, argv) == EXIT_FAILURE) { - return EXIT_FAILURE; - } + if (parse_args(argc, argv) == EXIT_FAILURE) { + return EXIT_FAILURE; + } - dds::domain::DomainParticipant participant(domain::default_id()); + dds::domain::DomainParticipant participant(domain::default_id()); - dds::topic::qos::TopicQos tqos; - tqos << dds::core::policy::Reliability::Reliable(dds::core::Duration::from_secs(10)) - << dds::core::policy::History::KeepAll() - << dds::core::policy::ResourceLimits(MAX_SAMPLES); + dds::topic::qos::TopicQos tqos; + tqos << dds::core::policy::Reliability::Reliable(dds::core::Duration::from_secs(10)) + << dds::core::policy::History::KeepAll() + << dds::core::policy::ResourceLimits(MAX_SAMPLES); - dds::topic::Topic topic(participant, "Throughput", tqos); + dds::topic::Topic topic(participant, "Throughput", tqos); - dds::pub::qos::PublisherQos pqos; - pqos << dds::core::policy::Partition(partitionName); + dds::pub::qos::PublisherQos pqos; + pqos << dds::core::policy::Partition(partitionName); - dds::pub::Publisher publisher(participant, pqos); + dds::pub::Publisher publisher(participant, pqos); - dds::pub::qos::DataWriterQos wqos(tqos); - wqos << dds::core::policy::WriterBatching::BatchUpdates(); + dds::pub::qos::DataWriterQos wqos(tqos); + wqos << dds::core::policy::WriterBatching::BatchUpdates(); - dds::pub::DataWriter writer(publisher, topic, wqos); + dds::pub::DataWriter writer(publisher, topic, wqos); - if (!wait_for_reader(writer)) - return EXIT_FAILURE; + if (!wait_for_reader(writer)) + return EXIT_FAILURE; - /* Fill the sample payload with data */ - sample.payload(std::vector(payloadSize, 'a')); + /* Fill the sample payload with data */ + sample.payload(std::vector(payloadSize, 'a')); - /* Register handler for Ctrl-C */ - signal (SIGINT, sigint); + /* Register handler for Ctrl-C */ + signal (SIGINT, sigint); - /* Register the sample instance and write samples repeatedly or until time out */ - start_writing(writer, sample); + /* Register the sample instance and write samples repeatedly or until time out */ + start_writing(writer, sample); - /* Cleanup */ - writer.dispose_instance(sample); + /* Cleanup */ + writer.dispose_instance(sample); + } catch (const dds::core::Exception& e) { + std::cerr << "DDS exception: " << e.what() << std::endl; + return EXIT_FAILURE; + } catch (const std::exception& e) { + std::cerr << "C++ exception: " << e.what() << std::endl; + return EXIT_FAILURE; + } catch (...) { + std::cerr << "Generic exception" << std::endl; + return EXIT_FAILURE; + } return EXIT_SUCCESS; } diff --git a/examples/throughput/subscriber.cpp b/examples/throughput/subscriber.cpp index d132a4a6..5627215f 100644 --- a/examples/throughput/subscriber.cpp +++ b/examples/throughput/subscriber.cpp @@ -249,48 +249,58 @@ class ThroughputListener: public dds::sub::NoOpDataReaderListener 0 ? "polling" : pollingDelay.count() < 0 ? "listener" : "waitset") << " approach.\n" << std::flush; + std::cout << subprefix << "Cycles: " << maxCycles << " | PollingDelay: " << pollingDelay.count() << " ms | Partition: " << partitionName << "\n" + << subprefix << "Using a " << (pollingDelay.count() > 0 ? "polling" : pollingDelay.count() < 0 ? "listener" : "waitset") << " approach.\n" << std::flush; - dds::domain::DomainParticipant participant(domain::default_id()); + dds::domain::DomainParticipant participant(domain::default_id()); - dds::topic::qos::TopicQos tqos; - tqos << dds::core::policy::Reliability::Reliable(dds::core::Duration::from_secs(10)) - << dds::core::policy::History::KeepAll() - << dds::core::policy::ResourceLimits(MAX_SAMPLES); + dds::topic::qos::TopicQos tqos; + tqos << dds::core::policy::Reliability::Reliable(dds::core::Duration::from_secs(10)) + << dds::core::policy::History::KeepAll() + << dds::core::policy::ResourceLimits(MAX_SAMPLES); - dds::topic::Topic topic(participant, "Throughput", tqos); + dds::topic::Topic topic(participant, "Throughput", tqos); - dds::sub::qos::SubscriberQos sqos; - sqos << dds::core::policy::Partition(partitionName); + dds::sub::qos::SubscriberQos sqos; + sqos << dds::core::policy::Partition(partitionName); - dds::sub::Subscriber subscriber(participant, sqos); + dds::sub::Subscriber subscriber(participant, sqos); - ThroughputListener listener; + ThroughputListener listener; - dds::sub::DataReader - reader( - subscriber, - topic, - dds::sub::qos::DataReaderQos(tqos), - pollingDelay.count() < 0 ? &listener : NULL, - pollingDelay.count() < 0 ? dds::core::status::StatusMask::data_available() : dds::core::status::StatusMask::none()); + dds::sub::DataReader + reader( + subscriber, + topic, + dds::sub::qos::DataReaderQos(tqos), + pollingDelay.count() < 0 ? &listener : NULL, + pollingDelay.count() < 0 ? dds::core::status::StatusMask::data_available() : dds::core::status::StatusMask::none()); - /* Process samples until Ctrl-C is pressed or until maxCycles */ - /* has been reached (0 = infinite) */ - signal (SIGINT, sigint); + /* Process samples until Ctrl-C is pressed or until maxCycles */ + /* has been reached (0 = infinite) */ + signal (SIGINT, sigint); - if (wait_for_writer (reader)) - { - std::cout << subprefix << "Waiting for samples...\n" << std::flush; + if (wait_for_writer (reader)) + { + std::cout << subprefix << "Waiting for samples...\n" << std::flush; - process_samples(reader, maxCycles); + process_samples(reader, maxCycles); + } + } catch (const dds::core::Exception& e) { + std::cerr << "DDS exception: " << e.what() << std::endl; + return EXIT_FAILURE; + } catch (const std::exception& e) { + std::cerr << "C++ exception: " << e.what() << std::endl; + return EXIT_FAILURE; + } catch (...) { + std::cerr << "Generic exception" << std::endl; + return EXIT_FAILURE; } return EXIT_SUCCESS; From 48e662f47cee5fd008d4955ad5347934e7fa43bd Mon Sep 17 00:00:00 2001 From: Martijn Reicher Date: Wed, 27 Sep 2023 11:47:35 +0200 Subject: [PATCH 2/4] Fix for coverity issue copy_constructor_call Fixes involve either using std::move or passing variable by const ref Signed-off-by: Martijn Reicher --- src/ddscxx/include/dds/sub/detail/TDataReaderImpl.hpp | 2 +- .../include/org/eclipse/cyclonedds/core/ObjectDelegate.hpp | 2 +- src/ddscxx/include/org/eclipse/cyclonedds/topic/CDRBlob.hpp | 4 ++-- src/ddscxx/src/org/eclipse/cyclonedds/core/ObjectDelegate.cpp | 2 +- src/idlcxx/src/generator.c | 3 ++- src/idlcxx/src/types.c | 4 ++-- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/ddscxx/include/dds/sub/detail/TDataReaderImpl.hpp b/src/ddscxx/include/dds/sub/detail/TDataReaderImpl.hpp index d288f0e4..60512a9c 100644 --- a/src/ddscxx/include/dds/sub/detail/TDataReaderImpl.hpp +++ b/src/ddscxx/include/dds/sub/detail/TDataReaderImpl.hpp @@ -911,7 +911,7 @@ dds::sub::detail::DataReader::Selector::get_mode() const template dds::sub::detail::DataReader::ManipulatorSelector::ManipulatorSelector(typename DataReader::ref_type dr) : - Selector(dr), read_mode_(true) + Selector(std::move(dr)), read_mode_(true) { } diff --git a/src/ddscxx/include/org/eclipse/cyclonedds/core/ObjectDelegate.hpp b/src/ddscxx/include/org/eclipse/cyclonedds/core/ObjectDelegate.hpp index c697740b..c79d9df7 100644 --- a/src/ddscxx/include/org/eclipse/cyclonedds/core/ObjectDelegate.hpp +++ b/src/ddscxx/include/org/eclipse/cyclonedds/core/ObjectDelegate.hpp @@ -51,7 +51,7 @@ class OMG_DDS_API ObjectDelegate protected: void check () const; - void set_weak_ref (ObjectDelegate::weak_ref_type weak_ref); + void set_weak_ref (const ObjectDelegate::weak_ref_type &weak_ref); Mutex mutex; bool closed; diff --git a/src/ddscxx/include/org/eclipse/cyclonedds/topic/CDRBlob.hpp b/src/ddscxx/include/org/eclipse/cyclonedds/topic/CDRBlob.hpp index e1c43fe6..d423d690 100644 --- a/src/ddscxx/include/org/eclipse/cyclonedds/topic/CDRBlob.hpp +++ b/src/ddscxx/include/org/eclipse/cyclonedds/topic/CDRBlob.hpp @@ -49,14 +49,14 @@ class CDRBlob const std::array& encoding() const { return this->encoding_; } std::array& encoding() { return this->encoding_; } void encoding(const std::array& _val_) { this->encoding_ = _val_; } - void encoding(std::array&& _val_) { this->encoding_ = _val_; } + void encoding(std::array&& _val_) { this->encoding_ = std::move(_val_); } BlobKind kind() const { return this->kind_; } BlobKind& kind() { return this->kind_; } void kind(BlobKind _val_) { this->kind_ = _val_; } const std::vector& payload() const { return this->payload_; } std::vector& payload() { return this->payload_; } void payload(const std::vector& _val_) { this->payload_ = _val_; } - void payload(std::vector&& _val_) { this->payload_ = _val_; } + void payload(std::vector&& _val_) { this->payload_ = std::move(_val_); } }; } diff --git a/src/ddscxx/src/org/eclipse/cyclonedds/core/ObjectDelegate.cpp b/src/ddscxx/src/org/eclipse/cyclonedds/core/ObjectDelegate.cpp index d63f937c..77bc7bf2 100644 --- a/src/ddscxx/src/org/eclipse/cyclonedds/core/ObjectDelegate.cpp +++ b/src/ddscxx/src/org/eclipse/cyclonedds/core/ObjectDelegate.cpp @@ -55,7 +55,7 @@ void org::eclipse::cyclonedds::core::ObjectDelegate::close () this->closed = true; } -void org::eclipse::cyclonedds::core::ObjectDelegate::set_weak_ref (ObjectDelegate::weak_ref_type weak_ref) +void org::eclipse::cyclonedds::core::ObjectDelegate::set_weak_ref (const ObjectDelegate::weak_ref_type &weak_ref) { this->myself = weak_ref; } diff --git a/src/idlcxx/src/generator.c b/src/idlcxx/src/generator.c index 1656cbc7..6971161f 100644 --- a/src/idlcxx/src/generator.c +++ b/src/idlcxx/src/generator.c @@ -861,7 +861,8 @@ generate_includes(const idl_pstate_t *pstate, struct generator *generator) } { int len = 0; - const char *incs[10]; + const char *incs[11]; + incs[len++] = ""; if (generator->uses_integers) incs[len++] = ""; diff --git a/src/idlcxx/src/types.c b/src/idlcxx/src/types.c index a909951d..56590a49 100644 --- a/src/idlcxx/src/types.c +++ b/src/idlcxx/src/types.c @@ -188,7 +188,7 @@ emit_member_methods( fmt = " const %3$s<%1$s>& %2$s() const { return this->%2$s_; }\n" " %3$s<%1$s>& %2$s() { return this->%2$s_; }\n" " void %2$s(const %3$s<%1$s>& _val_) { this->%2$s_ = _val_; }\n" - " void %2$s(%3$s<%1$s>&& _val_) { this->%2$s_ = _val_; }\n"; + " void %2$s(%3$s<%1$s>&& _val_) { this->%2$s_ = std::move(_val_); }\n"; eofmt = is_external(node) ? gen->external_format : gen->optional_format; } else if (idl_is_base_type(type_spec) || idl_is_enum(type_spec)) fmt = " %1$s %2$s() const { return this->%2$s_; }\n" @@ -198,7 +198,7 @@ emit_member_methods( fmt = " const %1$s& %2$s() const { return this->%2$s_; }\n" " %1$s& %2$s() { return this->%2$s_; }\n" " void %2$s(const %1$s& _val_) { this->%2$s_ = _val_; }\n" - " void %2$s(%1$s&& _val_) { this->%2$s_ = _val_; }\n"; + " void %2$s(%1$s&& _val_) { this->%2$s_ = std::move(_val_); }\n"; if (idl_fprintf(gen->header.handle, fmt, type, name, eofmt) < 0) return IDL_RETCODE_NO_MEMORY; From 139c10d0dd5fac3fb2171d71fc9cf8619099aa0e Mon Sep 17 00:00:00 2001 From: Martijn Reicher Date: Wed, 27 Sep 2023 11:49:19 +0200 Subject: [PATCH 3/4] Fix for coverity issue dead_error_line Fixed according to coverity suggestion: made variable const Signed-off-by: Martijn Reicher --- src/ddscxx/include/org/eclipse/cyclonedds/topic/datatopic.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddscxx/include/org/eclipse/cyclonedds/topic/datatopic.hpp b/src/ddscxx/include/org/eclipse/cyclonedds/topic/datatopic.hpp index f3f7464c..8cab4b8c 100644 --- a/src/ddscxx/include/org/eclipse/cyclonedds/topic/datatopic.hpp +++ b/src/ddscxx/include/org/eclipse/cyclonedds/topic/datatopic.hpp @@ -160,7 +160,7 @@ bool write_header(void *buffer) CHECK_FOR_NULL(buffer); memset(buffer, 0, DDSI_RTPS_HEADER_SIZE); auto hdr = static_cast(buffer); - auto le = native_endianness() == endianness::little_endian; + const auto le = (native_endianness() == endianness::little_endian); switch (TopicTraits::getExtensibility()) { case extensibility::ext_final: hdr[0] = le ? DDSI_RTPS_CDR2_LE : DDSI_RTPS_CDR2_BE; From 9b9e2b8a446be2be92933ea2cfd2f94d9e324812 Mon Sep 17 00:00:00 2001 From: Martijn Reicher Date: Wed, 27 Sep 2023 11:50:05 +0200 Subject: [PATCH 4/4] Fix for coverity issue dead_error_line in max functions Fixed this by adding coverity code that this error is intentional As fixing this will only make the code generator more complex, and any optimization of the compiler will eliminate that part of the code Signed-off-by: Martijn Reicher --- src/idlcxx/src/streamers.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/idlcxx/src/streamers.c b/src/idlcxx/src/streamers.c index 9fff8de5..79e9c2f1 100644 --- a/src/idlcxx/src/streamers.c +++ b/src/idlcxx/src/streamers.c @@ -448,13 +448,15 @@ sequence_writes(const idl_pstate_t* pstate, const char* sfmt = " if (se_%2$u > 0 &&\n" " !{T}(streamer, %1$s[0], se_%2$u))\n" " return false;\n"; - const char* mfmt = " if (se_%2$u > 0 &&\n" + const char* mfmt = " %3$s\n" + " if (se_%2$u > 0 &&\n" " !{T}(streamer, %1$s(), se_%2$u))\n" " return false;\n"; char* type = NULL; if (IDL_PRINTA(&type, get_cpp11_type, type_spec, streams->generator) < 0 - || multi_putf(streams, MOVE | MAX, mfmt, type, depth) + || multi_putf(streams, MOVE, mfmt, type, depth, "") + || multi_putf(streams, MAX, mfmt, type, depth, "// coverity[dead_error_line]") || multi_putf(streams, WRITE, sfmt, accessor, depth) || multi_putf(streams, READ, sfmt, read_accessor, depth)) return IDL_RETCODE_NO_MEMORY;