aboutsummaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorMartin Nowack <m.nowack@imperial.ac.uk>2019-04-03 15:58:18 +0100
committerCristian Cadar <c.cadar@imperial.ac.uk>2020-02-19 12:05:22 +0000
commitb723470d00f80ad5620b27e81f2afa9efdd95135 (patch)
treee602a56321f8561653ab89d2fbb43b1dcbe61fab /include
parent96a1dc82d0a96720cd48e0c8a286f14881098f99 (diff)
downloadklee-b723470d00f80ad5620b27e81f2afa9efdd95135.tar.gz
Fix ptr reference invalidation if last reference gets freed before new reference assigned.
Diffstat (limited to 'include')
-rw-r--r--include/klee/util/Ref.h29
1 files changed, 27 insertions, 2 deletions
diff --git a/include/klee/util/Ref.h b/include/klee/util/Ref.h
index c77149aa..44f3f49e 100644
--- a/include/klee/util/Ref.h
+++ b/include/klee/util/Ref.h
@@ -74,16 +74,41 @@ public:
* despite a redundant template. */
ref<T> &operator= (const ref<T> &r) {
r.inc();
+ // Create a copy of the pointer as the
+ // referenced object might get destroyed by the following dec(),
+ // like in the following example:
+ // ````````````````````````
+ // Expr {
+ // ref<Expr> next;
+ // }
+ //
+ // ref<Expr> root;
+ // root = root->next;
+ // ````````````````````````
+ T *saved_ptr = r.ptr;
dec();
- ptr = r.ptr;
+ ptr = saved_ptr;
return *this;
}
template<class U> ref<T> &operator= (const ref<U> &r) {
r.inc();
+ // Create a copy of the pointer as the currently
+ // referenced object might get destroyed by the following dec(),
+ // like in the following example:
+ // ````````````````````````
+ // Expr {
+ // ref<Expr> next;
+ // }
+ //
+ // ref<Expr> root;
+ // root = root->next;
+ // ````````````````````````
+
+ U *saved_ptr = r.ptr;
dec();
- ptr = r.ptr;
+ ptr = saved_ptr;
return *this;
}