about summary refs log tree commit diff homepage
path: root/unittests/Ref
diff options
context:
space:
mode:
authorCristian Cadar <cristic@cs.stanford.edu>2012-04-07 11:37:47 +0000
committerCristian Cadar <cristic@cs.stanford.edu>2012-04-07 11:37:47 +0000
commitdcf55acd75d7a6f74b7b9fa98f84083ea8b79760 (patch)
tree778f48fd84717aea77d3647ca73a25947239a817 /unittests/Ref
parent16c771d54330d73cc66b52922f37a4b6755d04b0 (diff)
downloadklee-dcf55acd75d7a6f74b7b9fa98f84083ea8b79760.tar.gz
Patch by Seungbeom that fixes a memory management issue with Refs, and
associated unit test.  More details at
http://keeda.stanford.edu/pipermail/klee-commits/2012-February/000904.html


git-svn-id: https://llvm.org/svn/llvm-project/klee/trunk@154256 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests/Ref')
-rw-r--r--unittests/Ref/Makefile19
-rw-r--r--unittests/Ref/RefTest.cpp31
2 files changed, 50 insertions, 0 deletions
diff --git a/unittests/Ref/Makefile b/unittests/Ref/Makefile
new file mode 100644
index 00000000..3117a5fd
--- /dev/null
+++ b/unittests/Ref/Makefile
@@ -0,0 +1,19 @@
+##===- unittests/Expr/Makefile -----------------------------*- Makefile -*-===##
+
+LEVEL := ../..
+include $(LEVEL)/Makefile.config
+
+TESTNAME := RefTest
+STP_LIBS := stp_c_interface.a stp_AST.a stp_bitvec.a \
+            stp_constantbv.a stp_sat.a stp_simplifier.a
+USEDLIBS := kleaverExpr.a kleeBasic.a
+ifeq ($(ENABLE_EXT_STP),0)
+  USEDLIBS += $(STP_LIBS)
+endif
+LINK_COMPONENTS := support
+
+include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest
+
+ifeq ($(ENABLE_EXT_STP),1)
+  LIBS += -lstp
+endif
diff --git a/unittests/Ref/RefTest.cpp b/unittests/Ref/RefTest.cpp
new file mode 100644
index 00000000..229fd9a8
--- /dev/null
+++ b/unittests/Ref/RefTest.cpp
@@ -0,0 +1,31 @@
+/* Regression test for a bug caused by assigning a ref to itself.
+   More details at http://keeda.stanford.edu/pipermail/klee-commits/2012-February/000904.html */
+
+#include "gtest/gtest.h"
+#include <iostream>
+#include "klee/util/Ref.h"
+using klee::ref;
+
+int finished = 0;
+
+struct Expr
+{
+  int refCount;
+  Expr() : refCount(0) { 
+    //std::cout << "Expr(" << this << ") created\n"; 
+  }
+  ~Expr() { 
+    //std::cout << "Expr(" << this << ") destroyed\n"; 
+    EXPECT_EQ(finished, 1);
+  }
+};
+
+TEST(RefTest, SelfAssign) 
+{
+  struct Expr *r_e = new Expr();
+  ref<Expr> r(r_e);
+  EXPECT_EQ(r_e->refCount, 1);
+  r = r;
+  EXPECT_EQ(r_e->refCount, 1);
+  finished = 1;
+}