From 2b3ea39de40bc7754cab558245e4ddac1b261750 Mon Sep 17 00:00:00 2001 From: Vasil Dimov Date: Wed, 14 Mar 2018 06:04:42 +0100 Subject: Polish interfaces around PeerLogicValidation * Make PeerLogicValidation final to prevent deriving from it [1] * Prevent deletions of NetEventsInterface and CValidationInterface objects via a base class pointer [1] silences the following compiler warning (from Clang 7.0.0): /usr/include/c++/v1/memory:2285:5: error: delete called on non-final 'PeerLogicValidation' that has virtual functions but non-virtual destructor [-Werror,-Wdelete-non-virtual-dtor] delete __ptr; ^ /usr/include/c++/v1/memory:2598:7: note: in instantiation of member function 'std::__1::default_delete::operator()' requested here __ptr_.second()(__tmp); ^ init.cpp:201:15: note: in instantiation of member function 'std::__1::unique_ptr >::reset' requested here peerLogic.reset(); ^ --- src/net.h | 7 +++++++ src/net_processing.h | 2 +- src/validationinterface.h | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/net.h b/src/net.h index 96f04d83e0..7839b75a86 100644 --- a/src/net.h +++ b/src/net.h @@ -469,6 +469,13 @@ public: virtual bool SendMessages(CNode* pnode, std::atomic& interrupt) = 0; virtual void InitializeNode(CNode* pnode) = 0; virtual void FinalizeNode(NodeId id, bool& update_connection_time) = 0; + +protected: + /** + * Protected destructor so that instances can only be deleted by derived classes. + * If that restriction is no longer desired, this should be made public and virtual. + */ + ~NetEventsInterface() = default; }; enum diff --git a/src/net_processing.h b/src/net_processing.h index ff1ebc59da..11543129cf 100644 --- a/src/net_processing.h +++ b/src/net_processing.h @@ -35,7 +35,7 @@ static constexpr int64_t EXTRA_PEER_CHECK_INTERVAL = 45; /** Minimum time an outbound-peer-eviction candidate must be connected for, in order to evict, in seconds */ static constexpr int64_t MINIMUM_CONNECT_TIME = 30; -class PeerLogicValidation : public CValidationInterface, public NetEventsInterface { +class PeerLogicValidation final : public CValidationInterface, public NetEventsInterface { private: CConnman* const connman; diff --git a/src/validationinterface.h b/src/validationinterface.h index 56ea698a2e..63097166af 100644 --- a/src/validationinterface.h +++ b/src/validationinterface.h @@ -55,6 +55,11 @@ void SyncWithValidationInterfaceQueue(); class CValidationInterface { protected: + /** + * Protected destructor so that instances can only be deleted by derived classes. + * If that restriction is no longer desired, this should be made public and virtual. + */ + ~CValidationInterface() = default; /** * Notifies listeners of updated block chain tip * -- cgit v1.2.3