summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGenCXX/sanitize-dtor-vtable.cpp
diff options
context:
space:
mode:
authorNaomi Musgrave <nmusgrave@google.com>2015-09-16 00:38:22 +0000
committerNaomi Musgrave <nmusgrave@google.com>2015-09-16 00:38:22 +0000
commit703835c7f33af043a88b57d01273c9310e7bad7c (patch)
tree4b5114f53850248ecd58a4132d6766f2ab9e1293 /clang/test/CodeGenCXX/sanitize-dtor-vtable.cpp
parentc9ca73336dfe3e62d26c8e8e02f817c977b849f4 (diff)
downloadbcm5719-llvm-703835c7f33af043a88b57d01273c9310e7bad7c.tar.gz
bcm5719-llvm-703835c7f33af043a88b57d01273c9310e7bad7c.zip
Implementation and testing for poisoning vtable
ptr in dtor. Summary: After destruction, invocation of virtual functions prevented by poisoning vtable pointer. Reviewers: eugenis, kcc Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D12712 Fixed testing callback emission order to account for vptr. Poison vtable in either complete or base dtor, depending on if virtual bases exist. If virtual bases exist, poison in complete dtor. Otherwise, poison in base. Remove commented-out block. llvm-svn: 247762
Diffstat (limited to 'clang/test/CodeGenCXX/sanitize-dtor-vtable.cpp')
-rw-r--r--clang/test/CodeGenCXX/sanitize-dtor-vtable.cpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/sanitize-dtor-vtable.cpp b/clang/test/CodeGenCXX/sanitize-dtor-vtable.cpp
new file mode 100644
index 00000000000..78be7949c32
--- /dev/null
+++ b/clang/test/CodeGenCXX/sanitize-dtor-vtable.cpp
@@ -0,0 +1,47 @@
+// RUN: %clang_cc1 -O0 -fsanitize=memory -fsanitize-memory-use-after-dtor -disable-llvm-optzns -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -O1 -fsanitize=memory -fsanitize-memory-use-after-dtor -disable-llvm-optzns -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s
+
+class A {
+ public:
+ int x;
+ A() {}
+ virtual ~A() {}
+};
+A a;
+
+class B : virtual public A {
+ public:
+ int y;
+ B() {}
+ ~B() {}
+};
+B b;
+
+// CHECK-LABEL: define {{.*}}AD1Ev
+// CHECK-NOT: call void @__sanitizer_dtor_callback
+// CHECK: call void {{.*}}AD2Ev
+// CHECK-NOT: call void @__sanitizer_dtor_callback
+// CHECK: ret void
+
+// After invoking base dtor and dtor for virtual base, poison vtable ptr.
+// CHECK-LABEL: define {{.*}}BD1Ev
+// CHECK-NOT: call void @__sanitizer_dtor_callback
+// CHECK: call void {{.*}}BD2Ev
+// CHECK-NOT: call void @__sanitizer_dtor_callback
+// CHECK: call void {{.*}}AD2Ev
+// CHECK: call void @__sanitizer_dtor_callback{{.*}}i64 8
+// CHECK-NOT: call void @__sanitizer_dtor_callback
+// CHECK: ret void
+
+// Since no virtual bases, poison vtable ptr here.
+// CHECK-LABEL: define {{.*}}AD2Ev
+// CHECK: call void @__sanitizer_dtor_callback
+// CHECK: call void @__sanitizer_dtor_callback{{.*}}i64 8
+// CHECK-NOT: call void @__sanitizer_dtor_callback
+// CHECK: ret void
+
+// Poison members
+// CHECK-LABEL: define {{.*}}BD2Ev
+// CHECK: call void @__sanitizer_dtor_callback
+// CHECK-NOT: call void @__sanitizer_dtor_callback
+// CHECK: ret void
OpenPOWER on IntegriCloud