build: disable `-Wnon-virtual-dtor` compiler warning
It's overkill and suffers from annoying false positives that
prevent us from applying the "protected non-virtual destructor"
idiom in several perfectly valid cases. See for instance the
GCC bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102168
The -Wdelete-non-virtual-dtor warning (included in -Wall) is
the preferred alternative and is enough to catch the unsafe
cases without false positives.
Partially reverts 847de408cbb2358bbb664d971cc33e73b0b2ef7f
Change-Id: I46ee1f01e7d4e2b125c2c534c6550824ba1de4c0
diff --git a/daemon/face/ethernet-factory.cpp b/daemon/face/ethernet-factory.cpp
index ee887c0..f7fb63f 100644
--- a/daemon/face/ethernet-factory.cpp
+++ b/daemon/face/ethernet-factory.cpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2014-2022, Regents of the University of California,
+ * Copyright (c) 2014-2023, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
@@ -47,8 +47,8 @@
: ProtocolFactory(params)
{
m_netifAddConn = netmon->onInterfaceAdded.connect([this] (const auto& netif) {
- this->applyUnicastConfigToNetif(netif);
- this->applyMcastConfigToNetif(*netif);
+ applyUnicastConfigToNetif(netif);
+ applyMcastConfigToNetif(*netif);
});
}
@@ -157,11 +157,11 @@
}
}
- // Even if there's no configuration change, we still need to re-apply configuration because
- // netifs may have changed.
- m_unicastConfig = unicastConfig;
- m_mcastConfig = mcastConfig;
- this->applyConfig(context);
+ // Even if there are no configuration changes, we still need to re-apply
+ // the configuration because netifs may have changed.
+ m_unicastConfig = std::move(unicastConfig);
+ m_mcastConfig = std::move(mcastConfig);
+ applyConfig(context);
}
void
@@ -347,6 +347,7 @@
// new face: register with forwarding
this->addFace(face);
}
+
return face;
}
@@ -366,9 +367,9 @@
// create channels and multicast faces if requested by config
for (const auto& netif : netmon->listNetworkInterfaces()) {
- this->applyUnicastConfigToNetif(netif);
+ applyUnicastConfigToNetif(netif);
- auto face = this->applyMcastConfigToNetif(*netif);
+ auto face = applyMcastConfigToNetif(*netif);
if (face != nullptr) {
// don't destroy face
oldFaces.erase(face);
diff --git a/daemon/face/internal-transport.hpp b/daemon/face/internal-transport.hpp
index 886af5c..4e77b67 100644
--- a/daemon/face/internal-transport.hpp
+++ b/daemon/face/internal-transport.hpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2014-2022, Regents of the University of California,
+ * Copyright (c) 2014-2023, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
@@ -32,19 +32,21 @@
namespace nfd::face {
-/** \brief Abstracts a transport that can be paired with another.
+/**
+ * \brief Abstracts a transport that can be paired with another.
*/
class InternalTransportBase
{
public:
- virtual
- ~InternalTransportBase() = default;
-
virtual void
receivePacket(const Block& packet) = 0;
+
+protected:
+ ~InternalTransportBase() = default;
};
-/** \brief Implements a forwarder-side transport that can be paired with another transport.
+/**
+ * \brief Implements a forwarder-side transport that can be paired with another transport.
*/
class InternalForwarderTransport final : public Transport, public InternalTransportBase
{
@@ -56,7 +58,7 @@
ndn::nfd::LinkType linkType = ndn::nfd::LINK_TYPE_POINT_TO_POINT);
void
- setPeer(InternalTransportBase* peer)
+ setPeer(InternalTransportBase* peer) noexcept
{
m_peer = peer;
}
@@ -78,7 +80,8 @@
InternalTransportBase* m_peer = nullptr;
};
-/** \brief Implements a client-side transport that can be paired with an InternalForwarderTransport.
+/**
+ * \brief Implements a client-side transport that can be paired with an InternalForwarderTransport.
*/
class InternalClientTransport final : public ndn::Transport, public InternalTransportBase
{
diff --git a/daemon/face/network-predicate.cpp b/daemon/face/network-predicate.cpp
index 798ceeb..85c219a 100644
--- a/daemon/face/network-predicate.cpp
+++ b/daemon/face/network-predicate.cpp
@@ -38,8 +38,6 @@
this->clear();
}
-NetworkPredicateBase::~NetworkPredicateBase() = default;
-
void
NetworkPredicateBase::clear()
{
diff --git a/daemon/face/network-predicate.hpp b/daemon/face/network-predicate.hpp
index 965ec88..815afcc 100644
--- a/daemon/face/network-predicate.hpp
+++ b/daemon/face/network-predicate.hpp
@@ -40,9 +40,6 @@
public:
NetworkPredicateBase();
- virtual
- ~NetworkPredicateBase();
-
/**
* \brief Set the whitelist to "*" and clear the blacklist.
*/
@@ -59,6 +56,25 @@
assign(std::initializer_list<std::pair<std::string, std::string>> whitelist,
std::initializer_list<std::pair<std::string, std::string>> blacklist);
+protected:
+ // Explicitly declare the following four special member functions
+ // to avoid -Wdeprecated-copy-with-dtor warnings from clang.
+
+ NetworkPredicateBase(const NetworkPredicateBase&) = delete;
+
+ NetworkPredicateBase(NetworkPredicateBase&&) = default;
+
+ NetworkPredicateBase&
+ operator=(const NetworkPredicateBase&) = delete;
+
+ NetworkPredicateBase&
+ operator=(NetworkPredicateBase&&) = default;
+
+ // NetworkPredicateBase is not supposed to be used polymorphically, so we make the destructor
+ // protected to prevent deletion of derived objects through a pointer to the base class,
+ // which would be UB when the destructor is non-virtual.
+ ~NetworkPredicateBase() = default;
+
private:
virtual bool
isRuleSupported(const std::string& key) = 0;
@@ -95,7 +111,7 @@
* ndn::net::NetworkInterface is accepted if it matches any entry in the whitelist and none of
* the entries in the blacklist.
*/
-class NetworkInterfacePredicate : public NetworkPredicateBase
+class NetworkInterfacePredicate final : public NetworkPredicateBase
{
public:
bool
@@ -117,7 +133,7 @@
* 2001:db8:2::/64`) or a wildcard (`*`) that matches all IP addresses. An IP address is
* accepted if it matches any entry in the whitelist and none of the entries in the blacklist.
*/
-class IpAddressPredicate : public NetworkPredicateBase
+class IpAddressPredicate final : public NetworkPredicateBase
{
public:
bool
diff --git a/daemon/face/udp-factory.cpp b/daemon/face/udp-factory.cpp
index c4baac2..2c22c4c 100644
--- a/daemon/face/udp-factory.cpp
+++ b/daemon/face/udp-factory.cpp
@@ -51,7 +51,7 @@
: ProtocolFactory(params)
{
m_netifAddConn = netmon->onInterfaceAdded.connect([this] (const auto& netif) {
- this->applyMcastConfigToNetif(netif);
+ applyMcastConfigToNetif(netif);
});
}
@@ -238,10 +238,10 @@
}
}
- // Even if there's no configuration change, we still need to re-apply configuration because
- // netifs may have changed.
- m_mcastConfig = mcastConfig;
- this->applyMcastConfig(context);
+ // Even if there are no configuration changes, we still need to re-apply
+ // the configuration because netifs may have changed.
+ m_mcastConfig = std::move(mcastConfig);
+ applyMcastConfig(context);
}
void
@@ -434,7 +434,7 @@
NFD_LOG_DEBUG("Not creating multicast faces on " << netif->getName() << ": no viable IP address");
// keep an eye on new addresses
m_netifConns[netif->getIndex()].addrAddConn =
- netif->onAddressAdded.connect([=] (auto&&...) { this->applyMcastConfigToNetif(netif); });
+ netif->onAddressAdded.connect([=] (auto&&...) { applyMcastConfigToNetif(netif); });
return {};
}
@@ -464,7 +464,7 @@
// create faces if requested by config
for (const auto& netif : netmon->listNetworkInterfaces()) {
- auto facesToKeep = this->applyMcastConfigToNetif(netif);
+ auto facesToKeep = applyMcastConfigToNetif(netif);
for (const auto& face : facesToKeep) {
// don't destroy face
facesToClose.erase(face);