blob: 8d190e09f342f38404c08e3f1c1b04add517e9df [file] [log] [blame]
Naomi Musgravebb4df942015-08-03 22:53:11 +00001// Test -fsanitize-memory-use-after-dtor
2// RUN: %clang_cc1 -fsanitize=memory -fsanitize-memory-use-after-dtor -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s
3// RUN: %clang_cc1 -DATTRIBUTE -fsanitize=memory -fsanitize-memory-use-after-dtor -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-ATTR
4
5template <class T> class Vector {
6 public:
7 ~Vector() {}
8};
9
10struct No_San {
11 Vector<int> v;
12 No_San() { }
13#ifdef ATTRIBUTE
14 __attribute__((no_sanitize_memory)) ~No_San() = default;
15#else
16 ~No_San() = default;
17#endif
18};
19
20int main() {
21 No_San *ns = new No_San();
22 ns->~No_San();
23 return 0;
24}
25
26// Repressing the sanitization attribute results in no msan
27// instrumentation of the destructor
28// CHECK: define {{.*}}No_SanD1Ev{{.*}} [[ATTRIBUTE:#[0-9]+]]
Naomi Musgrave9bd83fd2015-08-12 21:37:40 +000029// CHECK-NOT: call void @__sanitizer_dtor_callback
Naomi Musgravebb4df942015-08-03 22:53:11 +000030// CHECK: call void {{.*}}No_SanD2Ev
Naomi Musgrave9bd83fd2015-08-12 21:37:40 +000031// CHECK-NOT: call void @__sanitizer_dtor_callback
Naomi Musgravebb4df942015-08-03 22:53:11 +000032// CHECK: ret void
33
34// CHECK-ATTR: define {{.*}}No_SanD1Ev{{.*}} [[ATTRIBUTE:#[0-9]+]]
Naomi Musgrave9bd83fd2015-08-12 21:37:40 +000035// CHECK-ATTR-NOT: call void @__sanitizer_dtor_callback
Naomi Musgravebb4df942015-08-03 22:53:11 +000036// CHECK-ATTR: call void {{.*}}No_SanD2Ev
37// CHECK-ATTR-NOT: call void @__sanitizer_dtor_callback
38// CHECK-ATTR: ret void
39
40
41// CHECK: define {{.*}}No_SanD2Ev{{.*}} [[ATTRIBUTE:#[0-9]+]]
Naomi Musgravebb4df942015-08-03 22:53:11 +000042// CHECK: call void @__sanitizer_dtor_callback
Naomi Musgrave9bd83fd2015-08-12 21:37:40 +000043// CHECK-NOT: call void @__sanitizer_dtor_callback
44// CHECK: call void {{.*}}Vector
45// CHECK-NOT: call void @__sanitizer_dtor_callback
Naomi Musgravebb4df942015-08-03 22:53:11 +000046// CHECK: ret void
47
48// CHECK-ATTR: define {{.*}}No_SanD2Ev{{.*}} [[ATTRIBUTE:#[0-9]+]]
Naomi Musgrave9bd83fd2015-08-12 21:37:40 +000049// CHECK-ATTR-NOT: call void @__sanitizer_dtor_callback
Naomi Musgravebb4df942015-08-03 22:53:11 +000050// CHECK-ATTR: call void {{.*}}Vector
51// CHECK-ATTR-NOT: call void @__sanitizer_dtor_callback
52// CHECK-ATTR: ret void
53
54// When attribute is repressed, the destructor does not emit any tail calls
55// CHECK: attributes [[ATTRIBUTE]] = {{.*}} sanitize_memory
56// CHECK-ATTR-NOT: attributes [[ATTRIBUTE]] = {{.*}} sanitize_memory