Clang Project

clang_source_code/test/CodeGenCXX/sanitize-dtor-derived-class.cpp
1// RUN: %clang_cc1 -fsanitize=memory -fsanitize-memory-use-after-dtor -disable-llvm-passes -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s
2// RUN: %clang_cc1 -O1 -fsanitize=memory -fsanitize-memory-use-after-dtor -disable-llvm-passes -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s
3
4// Base dtor poisons members
5// Complete dtor poisons vtable ptr after destroying members and
6// virtual bases
7
8class Base {
9 public:
10  int x;
11  Base() {
12    x = 5;
13  }
14  virtual ~Base() {
15    x += 1;
16  }
17};
18
19class Derived : public Base {
20 public:
21  int y;
22  Derived() {
23    y = 10;
24  }
25  ~Derived() {
26    y += 1;
27  }
28};
29
30Derived d;
31
32// Invoke base destructor. No vtable pointer to poison.
33// CHECK-LABEL: define {{.*}}DerivedD1Ev
34// CHECK-NOT: call void @__sanitizer_dtor_callback
35// CHECK: call void {{.*}}DerivedD2Ev
36// CHECK-NOT: call void @__sanitizer_dtor_callback
37// CHECK: ret void
38
39// CHECK-LABEL: define {{.*}}DerivedD0Ev
40// CHECK-NOT: call void @__sanitizer_dtor_callback
41// CHECK: call void {{.*}}DerivedD1Ev
42// CHECK-NOT: call void @__sanitizer_dtor_callback
43// CHECK: ret void
44
45// Invokes base destructor, and poison vtable pointer.
46// CHECK-LABEL: define {{.*}}BaseD1Ev
47// CHECK-NOT: call void @__sanitizer_dtor_callback
48// CHECK: call void {{.*}}BaseD2Ev
49// CHECK-NOT: call void @__sanitizer_dtor_callback
50// CHECK: ret void
51
52// CHECK-LABEL: define {{.*}}BaseD0Ev
53// CHECK-NOT: call void @__sanitizer_dtor_callback
54// CHECK: call void {{.*}}BaseD1Ev
55// CHECK-NOT: call void @__sanitizer_dtor_callback
56// CHECK: ret void
57
58// Poison members and vtable ptr.
59// CHECK-LABEL: define {{.*}}BaseD2Ev
60// CHECK: call void @__sanitizer_dtor_callback
61// CHECK: call void @__sanitizer_dtor_callback{{.*}}i64 8
62// CHECK-NOT: call void @__sanitizer_dtor_callback
63// CHECK: ret void
64
65// Poison members and destroy non-virtual base.
66// CHECK-LABEL: define {{.*}}DerivedD2Ev
67// CHECK: call void @__sanitizer_dtor_callback
68// CHECK-NOT: call void @__sanitizer_dtor_callback
69// CHECK: call void {{.*}}BaseD2Ev
70// CHECK: call void @__sanitizer_dtor_callback{{.*}}i64 8
71// CHECK: ret void
72