From d16f35facc5c59ea6ccfe1e55b942e90c2fb2948 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Wed, 4 Mar 2015 10:55:32 +0100 Subject: [PATCH] CModule: use member initialization lists [-Weffc++] (#270) This fixes the problem that CModule::GetType() returned a random uninitialized value in CModule constructor, which was als the reason for #905. CModule constructor signature has been changed so that it optionally takes the type so it can be initialized appropriately. The new type argument has a default value in order to retain source compatibility in case some 3rdparty module would call CModule ctor by hand instead of using the MODCONSTRUCTOR macro. --- include/znc/Modules.h | 49 +++++++++++++++++++++++-------------------- src/Modules.cpp | 34 ++++++++++++++++++++---------- 2 files changed, 49 insertions(+), 34 deletions(-) diff --git a/include/znc/Modules.h b/include/znc/Modules.h index 2c915367..9eeb9ecc 100644 --- a/include/znc/Modules.h +++ b/include/znc/Modules.h @@ -49,16 +49,6 @@ class CModInfo; #endif #endif -typedef void* ModHandle; - -template void TModInfo(CModInfo& Info) {} - -template CModule* TModLoad(ModHandle p, CUser* pUser, - CIRCNetwork* pNetwork, const CString& sModName, - const CString& sModPath) { - return new M(p, pUser, pNetwork, sModName, sModPath); -} - #if HAVE_VISIBILITY # define MODULE_EXPORT __attribute__((__visibility__("default"))) #else @@ -97,8 +87,8 @@ template CModule* TModLoad(ModHandle p, CUser* pUser, */ #define MODCONSTRUCTOR(CLASS) \ CLASS(ModHandle pDLL, CUser* pUser, CIRCNetwork* pNetwork, const CString& sModName, \ - const CString& sModPath) \ - : CModule(pDLL, pUser, pNetwork, sModName, sModPath) + const CString& sModPath, CModInfo::EModuleType eType) \ + : CModule(pDLL, pUser, pNetwork, sModName, sModPath, eType) // User Module Macros /** This works exactly like MODULEDEFS, but for user modules. */ @@ -209,25 +199,30 @@ protected: }; #endif +typedef void* ModHandle; + class CModInfo { public: - typedef CModule* (*ModLoader)(ModHandle p, CUser* pUser, CIRCNetwork* pNetwork, const CString& sModName, const CString& sModPath); - typedef enum { GlobalModule, UserModule, NetworkModule } EModuleType; - CModInfo() { - m_fLoader = nullptr; - m_bHasArgs = false; + typedef CModule* (*ModLoader)(ModHandle p, CUser* pUser, CIRCNetwork* pNetwork, const CString& sModName, const CString& sModPath, EModuleType eType); + + CModInfo() : CModInfo("", "", NetworkModule) { } - CModInfo(const CString& sName, const CString& sPath, EModuleType eType) { - m_sName = sName; - m_sPath = sPath; - m_fLoader = nullptr; - m_bHasArgs = false; + CModInfo(const CString& sName, const CString& sPath, EModuleType eType) + : m_seType(), + m_eDefaultType(eType), + m_sName(sName), + m_sPath(sPath), + m_sDescription(""), + m_sWikiPage(""), + m_sArgsHelpText(""), + m_bHasArgs(false), + m_fLoader(nullptr) { } ~CModInfo() {} @@ -286,6 +281,14 @@ protected: ModLoader m_fLoader; }; +template void TModInfo(CModInfo& Info) {} + +template CModule* TModLoad(ModHandle p, CUser* pUser, + CIRCNetwork* pNetwork, const CString& sModName, + const CString& sModPath, CModInfo::EModuleType eType) { + return new M(p, pUser, pNetwork, sModName, sModPath, eType); +} + /** A helper class for handling commands in modules. */ class CModCommand { public: @@ -356,7 +359,7 @@ private: class CModule { public: CModule(ModHandle pDLL, CUser* pUser, CIRCNetwork* pNetwork, const CString& sModName, - const CString& sDataDir); + const CString& sDataDir, CModInfo::EModuleType eType = CModInfo::NetworkModule); // TODO: remove default value in ZNC 2.x virtual ~CModule(); CModule(const CModule&) = delete; diff --git a/src/Modules.cpp b/src/Modules.cpp index 0397a67d..8891eccc 100644 --- a/src/Modules.cpp +++ b/src/Modules.cpp @@ -124,15 +124,28 @@ const CString& CTimer::GetDescription() const { return m_sDescription; } /////////////////// !Timer /////////////////// -CModule::CModule(ModHandle pDLL, CUser* pUser, CIRCNetwork* pNetwork, const CString& sModName, const CString& sDataDir) { - m_pDLL = pDLL; - m_pManager = &(CZNC::Get().GetManager());; - m_pUser = pUser; - m_pNetwork = pNetwork; - m_pClient = nullptr; - m_sModName = sModName; - m_sDataDir = sDataDir; - +CModule::CModule(ModHandle pDLL, CUser* pUser, CIRCNetwork* pNetwork, const CString& sModName, const CString& sDataDir, CModInfo::EModuleType eType) + : m_eType(eType), + m_sDescription(""), + m_sTimers(), + m_sSockets(), +#ifdef HAVE_PTHREAD + m_sJobs(), +#endif + m_pDLL(pDLL), + m_pManager(&(CZNC::Get().GetManager())), + m_pUser(pUser), + m_pNetwork(pNetwork), + m_pClient(nullptr), + m_sModName(sModName), + m_sDataDir(sDataDir), + m_sSavePath(""), + m_sArgs(""), + m_sModPath(""), + m_mssRegistry(), + m_vSubPages(), + m_mCommands() +{ if (m_pNetwork) { m_sSavePath = m_pNetwork->GetNetworkPath() + "/moddata/" + m_sModName; } else if (m_pUser) { @@ -1023,9 +1036,8 @@ bool CModules::LoadModule(const CString& sModule, const CString& sArgs, CModInfo return false; } - CModule* pModule = Info.GetLoader()(p, pUser, pNetwork, sModule, sDataPath); + CModule* pModule = Info.GetLoader()(p, pUser, pNetwork, sModule, sDataPath, eType); pModule->SetDescription(Info.GetDescription()); - pModule->SetType(eType); pModule->SetArgs(sArgs); pModule->SetModPath(CDir::ChangeDir(CZNC::Get().GetCurPath(), sModPath)); push_back(pModule);