mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-01 10:16:09 +00:00

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
72 lines
2.1 KiB
C++
72 lines
2.1 KiB
C++
// RUN: %clang_cc1 -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
|
|
|
|
// Base dtor poisons members
|
|
// Complete dtor poisons vtable ptr after destroying members and
|
|
// virtual bases
|
|
|
|
class Base {
|
|
public:
|
|
int x;
|
|
Base() {
|
|
x = 5;
|
|
}
|
|
virtual ~Base() {
|
|
x += 1;
|
|
}
|
|
};
|
|
|
|
class Derived : public Base {
|
|
public:
|
|
int y;
|
|
Derived() {
|
|
y = 10;
|
|
}
|
|
~Derived() {
|
|
y += 1;
|
|
}
|
|
};
|
|
|
|
Derived d;
|
|
|
|
// Invoke base destructor. No vtable pointer to poison.
|
|
// CHECK-LABEL: define {{.*}}DerivedD1Ev
|
|
// CHECK-NOT: call void @__sanitizer_dtor_callback
|
|
// CHECK: call void {{.*}}DerivedD2Ev
|
|
// CHECK-NOT: call void @__sanitizer_dtor_callback
|
|
// CHECK: ret void
|
|
|
|
// CHECK-LABEL: define {{.*}}DerivedD0Ev
|
|
// CHECK-NOT: call void @__sanitizer_dtor_callback
|
|
// CHECK: call void {{.*}}DerivedD1Ev
|
|
// CHECK-NOT: call void @__sanitizer_dtor_callback
|
|
// CHECK: ret void
|
|
|
|
// Invokes base destructor, and poison vtable pointer.
|
|
// CHECK-LABEL: define {{.*}}BaseD1Ev
|
|
// CHECK-NOT: call void @__sanitizer_dtor_callback
|
|
// CHECK: call void {{.*}}BaseD2Ev
|
|
// CHECK-NOT: call void @__sanitizer_dtor_callback
|
|
// CHECK: ret void
|
|
|
|
// CHECK-LABEL: define {{.*}}BaseD0Ev
|
|
// CHECK-NOT: call void @__sanitizer_dtor_callback
|
|
// CHECK: call void {{.*}}BaseD1Ev
|
|
// CHECK-NOT: call void @__sanitizer_dtor_callback
|
|
// CHECK: ret void
|
|
|
|
// Poison members and vtable ptr.
|
|
// CHECK-LABEL: define {{.*}}BaseD2Ev
|
|
// 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 and destroy non-virtual base.
|
|
// CHECK-LABEL: define {{.*}}DerivedD2Ev
|
|
// CHECK: call void @__sanitizer_dtor_callback
|
|
// CHECK-NOT: call void @__sanitizer_dtor_callback
|
|
// CHECK: call void {{.*}}BaseD2Ev
|
|
// CHECK: call void @__sanitizer_dtor_callback{{.*}}i64 8
|
|
// CHECK: ret void
|