diff options
author | Martin Nowack <m.nowack@imperial.ac.uk> | 2019-04-03 15:58:18 +0100 |
---|---|---|
committer | Cristian Cadar <c.cadar@imperial.ac.uk> | 2020-02-19 12:05:22 +0000 |
commit | b723470d00f80ad5620b27e81f2afa9efdd95135 (patch) | |
tree | e602a56321f8561653ab89d2fbb43b1dcbe61fab /unittests | |
parent | 96a1dc82d0a96720cd48e0c8a286f14881098f99 (diff) | |
download | klee-b723470d00f80ad5620b27e81f2afa9efdd95135.tar.gz |
Fix ptr reference invalidation if last reference gets freed before new reference assigned.
Diffstat (limited to 'unittests')
-rw-r--r-- | unittests/Ref/RefTest.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/unittests/Ref/RefTest.cpp b/unittests/Ref/RefTest.cpp index 48a15885..7d587f69 100644 --- a/unittests/Ref/RefTest.cpp +++ b/unittests/Ref/RefTest.cpp @@ -16,6 +16,7 @@ using klee::ref; int finished = 0; +int finished_counter = 0; struct Expr { @@ -38,3 +39,32 @@ TEST(RefTest, SelfAssign) EXPECT_EQ(r_e->refCount, 1); finished = 1; } +struct SelfRefExpr { + /// @brief Required by klee::ref-managed objects + struct klee::ReferenceCounter __refCount; + ref<SelfRefExpr> next_; + + explicit SelfRefExpr(ref<SelfRefExpr> next) : next_(next) {} + SelfRefExpr(const SelfRefExpr &) = delete; + SelfRefExpr &operator=(const SelfRefExpr &) = delete; + + ~SelfRefExpr() { finished_counter++; } +}; +TEST(RefTest, SelfRef) { + struct SelfRefExpr *e_1 = new SelfRefExpr(nullptr); + ref<SelfRefExpr> r_e_1(e_1); + EXPECT_EQ(1u, r_e_1->__refCount.refCount); + ref<SelfRefExpr> r_root = r_e_1; + EXPECT_EQ(2u, r_e_1->__refCount.refCount); + + { + ref<SelfRefExpr> r2(new SelfRefExpr(r_e_1)); + EXPECT_EQ(3u, r_e_1->__refCount.refCount); + + r_root = r2; + EXPECT_EQ(2u, r_e_1->__refCount.refCount); + } + + r_root = r_root->next_; + EXPECT_EQ(2u, r_e_1->__refCount.refCount); +} \ No newline at end of file |