diff options
author | Naomi Musgrave <nmusgrave@google.com> | 2015-09-16 00:38:22 +0000 |
---|---|---|
committer | Naomi Musgrave <nmusgrave@google.com> | 2015-09-16 00:38:22 +0000 |
commit | 703835c7f33af043a88b57d01273c9310e7bad7c (patch) | |
tree | 4b5114f53850248ecd58a4132d6766f2ab9e1293 /clang/test/CodeGenCXX/sanitize-dtor-vtable.cpp | |
parent | c9ca73336dfe3e62d26c8e8e02f817c977b849f4 (diff) | |
download | bcm5719-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.cpp | 47 |
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 |