1 | // RUN: %clangxx_msan %s -O0 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && %run %t >%t.out 2>&1 |
2 | |
3 | // RUN: %clangxx_msan %s -O1 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && %run %t >%t.out 2>&1 |
4 | |
5 | // RUN: %clangxx_msan %s -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && %run %t >%t.out 2>&1 |
6 | |
7 | #include <sanitizer/msan_interface.h> |
8 | #include <assert.h> |
9 | #include <stdio.h> |
10 | |
11 | template <class T> |
12 | class Vector { |
13 | public: |
14 | int size; |
15 | ~Vector() { |
16 | printf(format: "~V %p %lu\n" , &size, sizeof(size)); |
17 | assert(__msan_test_shadow(&this->size, sizeof(this->size)) == -1); |
18 | } |
19 | }; |
20 | |
21 | struct Derived { |
22 | int derived_a; |
23 | Vector<int> derived_v1; |
24 | Vector<int> derived_v2; |
25 | double derived_b; |
26 | double derived_c; |
27 | Derived() { |
28 | derived_a = 5; |
29 | derived_v1.size = 1; |
30 | derived_v2.size = 1; |
31 | derived_b = 7; |
32 | derived_c = 10; |
33 | } |
34 | ~Derived() { |
35 | printf(format: "~D %p %p %p %lu\n" , &derived_a, &derived_v1, &derived_c, sizeof(*this)); |
36 | assert(__msan_test_shadow(&derived_a, sizeof(derived_a)) == -1); |
37 | assert(__msan_test_shadow(&derived_v1, sizeof(derived_v1)) == -1); |
38 | assert(__msan_test_shadow(&derived_v2, sizeof(derived_v2)) == -1); |
39 | assert(__msan_test_shadow(&derived_b, sizeof(derived_b)) == -1); |
40 | assert(__msan_test_shadow(&derived_c, sizeof(derived_c)) == -1); |
41 | } |
42 | }; |
43 | |
44 | int main() { |
45 | Derived *d = new Derived(); |
46 | d->~Derived(); |
47 | |
48 | assert(__msan_test_shadow(&d->derived_a, sizeof(d->derived_a)) != -1); |
49 | assert(__msan_test_shadow(&d->derived_v1, sizeof(d->derived_v1)) != -1); |
50 | assert(__msan_test_shadow(&d->derived_v2, sizeof(d->derived_v2)) != -1); |
51 | assert(__msan_test_shadow(&d->derived_b, sizeof(d->derived_b)) != -1); |
52 | assert(__msan_test_shadow(&d->derived_c, sizeof(d->derived_c)) != -1); |
53 | |
54 | return 0; |
55 | } |
56 | |