Skip to content

Commit d979d8f

Browse files
author
Javier Gil Aviles
committed
Refs #21358: Fix null-deprecated error
Signed-off-by: Javier Gil Aviles <javiergil@eprosima.com>
1 parent f4bfd05 commit d979d8f

16 files changed

Lines changed: 216 additions & 11 deletions

File tree

.github/workflows/reusable-ubuntu-ci.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ on:
6060

6161
env:
6262
security-cmake-flag: ${{ inputs.security == true && '-DSECURITY=ON' || '-DSECURITY=OFF' }}
63-
colcon-build-default-cmake-args: '-DCMAKE_CXX_FLAGS="-Werror -Wall -Wextra -Wpedantic -Wunused-value -Woverloaded-virtual -Wsign-compare -Wcast-align -Wlogical-op -Wduplicated-cond -Wrestrict -Wpointer-arith -Wwrite-strings -Wunreachable-code"'
6463
defaults:
6564
run:
6665
shell: bash
@@ -74,6 +73,8 @@ jobs:
7473
matrix:
7574
cmake-build-type:
7675
- 'RelWithDebInfo'
76+
env:
77+
colcon-build-default-cmake-args: '-DCMAKE_CXX_FLAGS="-Werror -Wall -Wextra -Wpedantic -Wunused-value -Woverloaded-virtual -Wsign-compare -Wcast-align -Wlogical-op -Wduplicated-cond -Wrestrict -Wnull-dereference -Wpointer-arith -Wwrite-strings -Wunreachable-code"'
7778
steps:
7879
- name: Add ci-pending label if PR
7980
if: ${{ github.event_name == 'pull_request' && inputs.add-label == true }}

include/fastdds/rtps/common/Guid.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ namespace rtps {
3434

3535
struct InstanceHandle_t;
3636

37+
#ifndef _MSC_VER
38+
#pragma GCC diagnostic push
39+
#pragma GCC diagnostic ignored "-Wnull-dereference"
40+
#endif
41+
3742
//!@brief Structure GUID_t, entity identifier, unique in DDS-RTPS Domain.
3843
//!@ingroup COMMON_MODULE
3944
struct FASTDDS_EXPORTED_API GUID_t
@@ -147,6 +152,10 @@ struct FASTDDS_EXPORTED_API GUID_t
147152
}
148153
};
149154

155+
#ifndef _MSC_VER
156+
#pragma GCC diagnostic pop
157+
#endif
158+
150159
#ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC
151160

152161
/**

src/cpp/fastdds/publisher/DataWriter.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,24 @@ DataWriter::DataWriter(
4040
DataWriterListener* listener,
4141
const StatusMask& mask)
4242
: DomainEntity(mask)
43-
, impl_(pub->create_datawriter(topic, qos, listener, mask)->impl_)
43+
, impl_(nullptr)
4444
{
45+
if (nullptr == pub)
46+
{
47+
EPROSIMA_LOG_ERROR(DATA_WRITER, "Publisher pointer is null");
48+
}
49+
else
50+
{
51+
DataWriter* dw = pub->create_datawriter(topic, qos, listener, mask);
52+
if (nullptr == dw)
53+
{
54+
EPROSIMA_LOG_ERROR(DATA_WRITER, "Publisher::create_datawriter returned null");
55+
}
56+
else
57+
{
58+
impl_ = dw->impl_;
59+
}
60+
}
4561
}
4662

4763
DataWriter::~DataWriter()

src/cpp/fastdds/xtypes/dynamic_types/AnnotationDescriptorImpl.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,11 @@ bool AnnotationDescriptorImpl::is_consistent() noexcept
137137
{
138138
return false;
139139
}
140+
141+
if (!ann_param_type)
142+
{
143+
return false;
144+
}
140145
//}}}
141146

142147
//{{{ Check the parameter value is convertible to its type.

src/cpp/fastdds/xtypes/dynamic_types/DynamicDataImpl.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1585,6 +1585,10 @@ size_t DynamicDataImpl::calculate_key_serialized_size(
15851585
for (auto& member : enclosing_type_->get_all_members())
15861586
{
15871587
auto member_impl {traits<DynamicTypeMember>::narrow<DynamicTypeMemberImpl>(member.second)};
1588+
if (!member_impl)
1589+
{
1590+
continue;
1591+
}
15881592
if (member_impl->get_descriptor().is_key())
15891593
{
15901594
there_is_keyed_member = true;
@@ -1610,6 +1614,10 @@ size_t DynamicDataImpl::calculate_key_serialized_size(
16101614
for (auto& member : enclosing_type_->get_all_members())
16111615
{
16121616
auto member_impl {traits<DynamicTypeMember>::narrow<DynamicTypeMemberImpl>(member.second)};
1617+
if (!member_impl)
1618+
{
1619+
continue;
1620+
}
16131621
auto member_type {traits<DynamicType>::narrow<DynamicTypeImpl>(member_impl->get_descriptor().type())};
16141622

16151623
//TODO(richiware) For the future support of optionals. Optional member cannot be a keyed member.
@@ -1978,6 +1986,10 @@ void DynamicDataImpl::serialize_key(
19781986
for (auto& member : enclosing_type_->get_all_members())
19791987
{
19801988
auto member_impl {traits<DynamicTypeMember>::narrow<DynamicTypeMemberImpl>(member.second)};
1989+
if (!member_impl)
1990+
{
1991+
continue;
1992+
}
19811993
if (member_impl->get_descriptor().is_key())
19821994
{
19831995
there_is_keyed_member = true;
@@ -2002,6 +2014,10 @@ void DynamicDataImpl::serialize_key(
20022014
for (auto& member : enclosing_type_->get_all_members())
20032015
{
20042016
auto member_impl {traits<DynamicTypeMember>::narrow<DynamicTypeMemberImpl>(member.second)};
2017+
if (!member_impl)
2018+
{
2019+
continue;
2020+
}
20052021
auto member_type {traits<DynamicType>::narrow<DynamicTypeImpl>(member_impl->get_descriptor().type())};
20062022

20072023
if (TK_MAP != member_type->resolve_alias_enclosed_type()->get_kind())
@@ -2050,6 +2066,11 @@ void DynamicDataImpl::apply_bitset_mask(
20502066
assert(enclosing_type_->get_all_members().end() != enclosing_type_->get_all_members().find(member_id));
20512067
const auto member_impl {traits<DynamicTypeMember>::narrow<DynamicTypeMemberImpl>(
20522068
enclosing_type_->get_all_members().at(member_id))};
2069+
if (!member_impl)
2070+
{
2071+
EPROSIMA_LOG_ERROR(DYN_TYPES, "Error applying bitset mask. MemberId not found.");
2072+
return;
2073+
}
20532074
const auto member_index {member_impl->get_descriptor().index()};
20542075
const auto bound {enclosing_type_->get_descriptor().bound().at(member_index)};
20552076
uint64_t mask {64 == bound ? 0x0llu : 0XFFFFFFFFFFFFFFFFllu << bound};
@@ -4008,6 +4029,13 @@ void DynamicDataImpl::set_discriminator_value(
40084029
auto m_impl = traits<DynamicTypeMember>::narrow<DynamicTypeMemberImpl>(member);
40094030
int32_t label {0};
40104031

4032+
if (!m_impl)
4033+
{
4034+
EPROSIMA_LOG_ERROR(DYN_TYPES, "MemberId " << id << " not found in enclosing type "
4035+
<< enclosing_type_->get_descriptor().name());
4036+
return;
4037+
}
4038+
40114039
if (m_impl->get_descriptor().is_default_label())
40124040
{
40134041
label = enclosing_type_->default_value();
@@ -6406,6 +6434,11 @@ bool DynamicDataImpl::deserialize(
64066434
{
64076435
auto member_impl = traits<DynamicTypeMember>::narrow<DynamicTypeMemberImpl>(member);
64086436
traits<DynamicDataImpl>::ref_type member_data;
6437+
if (!member_impl)
6438+
{
6439+
throw fastcdr::exception::BadParamException(
6440+
"Member not found in DynamicTypeImpl");
6441+
}
64096442
auto it = value_.find(member_impl->get_id());
64106443

64116444
if (it != value_.end())
@@ -6466,6 +6499,12 @@ bool DynamicDataImpl::deserialize(
64666499
auto m_impl {traits<DynamicTypeMember>::narrow<DynamicTypeMemberImpl>(
64676500
member)};
64686501

6502+
if (!m_impl)
6503+
{
6504+
ret_value = false;
6505+
continue;
6506+
}
6507+
64696508
for (auto label : m_impl->get_descriptor().label())
64706509
{
64716510
if (static_cast<int32_t>(discriminator) == label)

src/cpp/fastdds/xtypes/dynamic_types/DynamicDataImpl.hpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,11 @@ class DynamicDataImpl : public traits<DynamicData>::base_type
491491
enclosing_type_->get_member(selected_member, selected_union_member_);
492492
auto sm_impl = traits<DynamicTypeMember>::narrow<DynamicTypeMemberImpl>(selected_member);
493493

494+
if (!sm_impl)
495+
{
496+
return false;
497+
}
498+
494499
for (auto label : sm_impl->get_descriptor().label())
495500
{
496501
if (static_cast<int32_t>(value) == label)
@@ -512,6 +517,12 @@ class DynamicDataImpl : public traits<DynamicData>::base_type
512517
{
513518
auto m_impl = traits<DynamicTypeMember>::narrow<DynamicTypeMemberImpl>(member);
514519

520+
if (!m_impl)
521+
{
522+
ret_value = false;
523+
continue;
524+
}
525+
515526
for (auto label : m_impl->get_descriptor().label())
516527
{
517528
if (static_cast<int32_t>(value) == label)

src/cpp/fastdds/xtypes/dynamic_types/DynamicPubSubType.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,11 @@ bool DynamicPubSubType::serialize(
232232
payload.encapsulation = ser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
233233

234234
auto type_impl = traits<DynamicType>::narrow<DynamicTypeImpl>(dynamic_type_);
235+
if (!type_impl)
236+
{
237+
EPROSIMA_LOG_ERROR(DYN_TYPES, "DynamicPubSubType cannot serialize data. Unspecified type.");
238+
return false;
239+
}
235240
ser.set_encoding_flag(get_fastcdr_encoding_flag(type_impl->get_descriptor().extensibility_kind(),
236241
fastdds::dds::DataRepresentationId_t::XCDR_DATA_REPRESENTATION == data_representation?
237242
eprosima::fastcdr::CdrVersion:: XCDRv1 :
@@ -317,6 +322,10 @@ void DynamicPubSubType::update_dynamic_type()
317322
for (auto& member : type_impl->get_all_members_by_index())
318323
{
319324
auto member_impl = traits<DynamicTypeMember>::narrow<DynamicTypeMemberImpl>(member);
325+
if (!member_impl)
326+
{
327+
continue;
328+
}
320329
if (member_impl->get_descriptor().is_key())
321330
{
322331
is_compute_key_provided = true;

src/cpp/fastdds/xtypes/dynamic_types/DynamicTypeBuilderFactoryImpl.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@ traits<DynamicTypeBuilder>::ref_type DynamicTypeBuilderFactoryImpl::create_type(
5656
{
5757
auto descriptor_impl = traits<TypeDescriptor>::narrow<TypeDescriptorImpl>(descriptor);
5858

59+
if (!descriptor_impl)
60+
{
61+
EPROSIMA_LOG_ERROR(DYN_TYPES, "Invalid TypeDescriptor provided to create_type.");
62+
return {};
63+
}
64+
5965
if (descriptor_impl->is_consistent())
6066
{
6167
return std::make_shared<DynamicTypeBuilderImpl>(*descriptor_impl);

src/cpp/fastdds/xtypes/dynamic_types/DynamicTypeBuilderImpl.cpp

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,16 @@ DynamicTypeBuilderImpl::DynamicTypeBuilderImpl(
5959
{
6060
traits<DynamicTypeMemberImpl>::ref_type member_impl {traits<DynamicTypeMember>::narrow<DynamicTypeMemberImpl>(
6161
members_.back())};
62-
assert(MEMBER_ID_INVALID != member_impl->get_descriptor().id());
63-
next_id_ = member_impl->get_descriptor().id() + 1;
62+
if (!member_impl)
63+
{
64+
EPROSIMA_LOG_ERROR(DYN_TYPES,
65+
"Internal error: last member is not a DynamicTypeMemberImpl");
66+
}
67+
else
68+
{
69+
assert(MEMBER_ID_INVALID != member_impl->get_descriptor().id());
70+
next_id_ = member_impl->get_descriptor().id() + 1;
71+
}
6472
}
6573

6674
next_index_ = static_cast<uint32_t>(members_.size());
@@ -453,6 +461,11 @@ ReturnCode_t DynamicTypeBuilderImpl::add_member(
453461
{
454462
const MemberId mid {member.first};
455463
const auto member_impl {traits<DynamicTypeMember>::narrow<DynamicTypeMemberImpl>(member.second)};
464+
if (!member_impl)
465+
{
466+
EPROSIMA_LOG_ERROR(DYN_TYPES, "Member with id " << mid << " is not a DynamicTypeMemberImpl");
467+
return RETCODE_BAD_PARAMETER;
468+
}
456469
const auto member_index {member_impl->get_descriptor().index()};
457470

458471
if (mid == new_member_id)
@@ -499,6 +512,12 @@ ReturnCode_t DynamicTypeBuilderImpl::add_member(
499512
{
500513
const auto member_impl = traits<DynamicTypeMember>::narrow<DynamicTypeMemberImpl>(members_.at(0));
501514

515+
if (!member_impl)
516+
{
517+
EPROSIMA_LOG_ERROR(DYN_TYPES, "Member is not a DynamicTypeMemberImpl");
518+
return RETCODE_BAD_PARAMETER;
519+
}
520+
502521
if (member_impl->get_descriptor().type()->get_kind() != descriptor->type()->get_kind())
503522
{
504523
EPROSIMA_LOG_ERROR(DYN_TYPES, "Descriptor type kind differs from the current member types.");
@@ -554,6 +573,11 @@ ReturnCode_t DynamicTypeBuilderImpl::add_member(
554573
for (++it; it != members_.end(); ++it)
555574
{
556575
auto next_member = traits<DynamicTypeMember>::narrow<DynamicTypeMemberImpl>(*it);
576+
if (!next_member)
577+
{
578+
EPROSIMA_LOG_ERROR(DYN_TYPES, "Member is not a DynamicTypeMemberImpl");
579+
return RETCODE_BAD_PARAMETER;
580+
}
557581
next_member->get_descriptor().index(next_member->get_descriptor().index() + 1);
558582
}
559583
++next_index_;

src/cpp/rtps/builtin/discovery/endpoint/EDPSimple.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,19 @@ void EDPSimple::processPersistentData(
157157
std::lock_guard<RecursiveTimedMutex> guardW(writer.first->getMutex());
158158
std::lock_guard<std::recursive_mutex> guardP(*mp_PDP->getMutex());
159159

160+
if (nullptr == mp_PDP)
161+
{
162+
EPROSIMA_LOG_ERROR(RTPS_EDP, "Cannot processPersistentData: mp_PDP is null");
163+
return;
164+
}
165+
ParticipantProxyData* local_ppd = mp_PDP->getLocalParticipantProxyData();
166+
if (nullptr == local_ppd)
167+
{
168+
EPROSIMA_LOG_ERROR(RTPS_EDP, "Cannot processPersistentData: LocalParticipantProxyData is null");
169+
return;
170+
}
160171
// own server instance
161-
InstanceHandle_t server_key = mp_PDP->getLocalParticipantProxyData()->m_key;
172+
InstanceHandle_t server_key = local_ppd->m_key;
162173

163174
// reference own references from writer history
164175
std::forward_list<CacheChange_t*> removal;

0 commit comments

Comments
 (0)