diff --git a/src/domino/DataDomino.hpp b/src/domino/DataDomino.hpp index bb6cfe3..72bbddf 100644 --- a/src/domino/DataDomino.hpp +++ b/src/domino/DataDomino.hpp @@ -13,7 +13,6 @@ #pragma once #include -#include // make_shared #include "UniLog.hpp" #include "UniPtr.hpp" diff --git a/src/msg_self/MsgSelf.hpp b/src/msg_self/MsgSelf.hpp index 0a9526b..7e8fc86 100644 --- a/src/msg_self/MsgSelf.hpp +++ b/src/msg_self/MsgSelf.hpp @@ -39,7 +39,6 @@ #pragma once #include -#include // shared_ptr #include #include "UniLog.hpp" @@ -73,7 +72,7 @@ using SharedMsgCB = shared_ptr; class MsgSelf : public UniLog { public: - MsgSelf(const LogName& aUniLogName = ULN_DEFAULT) : UniLog(aUniLogName) {} + explicit MsgSelf(const LogName& aUniLogName = ULN_DEFAULT) : UniLog(aUniLogName) {} ~MsgSelf() { if (nMsg_) WRN("discard nMsg=" << nMsg_); } void newMsg(const MsgCB&, const EMsgPriority = EMsgPri_NORM); // can't withdraw CB but easier usage diff --git a/src/safe_mem/SafePtr.hpp b/src/safe_mem/SafePtr.hpp index 178a8e6..642519e 100644 --- a/src/safe_mem/SafePtr.hpp +++ b/src/safe_mem/SafePtr.hpp @@ -9,10 +9,10 @@ // . ms & google: ~70% safety defects caused by mem safe issue // - REQ: this class is to enhance safety of shared_ptr: // . safe create : null or make_safe only (not allow unsafe create eg via raw ptr); minor in mem-bug -// . safe cast : only among self, base & void; compile-err is safer than ret-null; major in mem-bug +// * safe cast : only among self, base & void; compile-err is safer than ret-null; major in mem-bug // . safe lifecycle: by shared_ptr (auto mem-mgmt, no use-after-free); major in mem-bug // . safe ptr array: no need since std::array -// . safe del : not support self-deletor that maybe unsafe +// . safe del : not support self-deletor that maybe unsafe; call correct destructor // . loop-ref : ??? // - DUTY-BOUND: // . ensure ptr address is safe: legal created, not freed, not wild, etc @@ -20,7 +20,7 @@ // . not SafePtr but T to ensure T's inner safety (eg no exception within T's constructor) // . hope cooperate with tool to ensure/track SafePtr, all T, all code's mem safe // -// - VALUE: +// - How to solve safety issue: // . way#1: Rust is language-based mem ctrl (heavy) // . way#2: tool (dynamic eg valdrind, or static eg coverity) // . keep legacy code/invest diff --git a/ut/safe_mem/SafePtrTest.cpp b/ut/safe_mem/SafePtrTest.cpp index 246f17b..35145a6 100644 --- a/ut/safe_mem/SafePtrTest.cpp +++ b/ut/safe_mem/SafePtrTest.cpp @@ -211,6 +211,43 @@ TEST(SafePtrTest, safe_assign) // operator=() is auto-gen, just simple test 1 c EXPECT_EQ(42, *(one.get())) << "REQ: valid get after assigner is reset"; } +#define DESTRUCT +// *********************************************************************************************** +struct TestBase +{ + bool& isBaseOver_; + explicit TestBase(bool& aExtFlag) : isBaseOver_(aExtFlag) { isBaseOver_ = false; } + virtual ~TestBase() { isBaseOver_ = true; } +}; +TEST(SafePtrTest, GOLD_destructByVoid) +{ + bool isBaseOver; + SafePtr test = make_safe(isBaseOver); + EXPECT_FALSE(isBaseOver) << "correctly constructed"; + + test = nullptr; + EXPECT_TRUE(isBaseOver) << "REQ: correctly destructed by SafePtr"; +} +struct TestDerive : public TestBase +{ + bool& isDeriveOver_; + explicit TestDerive(bool& aBaseFlag, bool& aDeriveFlag) + : TestBase(aBaseFlag) + , isDeriveOver_(aDeriveFlag) + { isDeriveOver_ = false; } + ~TestDerive() { isDeriveOver_ = true; } +}; +TEST(SafePtrTest, GOLD_destructByBase) +{ + bool isBaseOver; + bool isDeriveOver; + SafePtr test = make_safe(isBaseOver, isDeriveOver); + EXPECT_FALSE(isDeriveOver) << "correctly constructed"; + + test = nullptr; + EXPECT_TRUE(isDeriveOver) << "REQ: correctly destructed by SafePtr"; +} + #define LIKE_SHARED_PTR // *********************************************************************************************** TEST(SafePtrTest, get_isMemSafe_afterDelOrigin)