| // RUN: %clangxx_msan %s -O0 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t >%t.out 2>&1 |
| |
| // RUN: %clangxx_msan %s -O1 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t >%t.out 2>&1 |
| |
| // RUN: %clangxx_msan %s -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t >%t.out 2>&1 |
| |
| #include <sanitizer/msan_interface.h> |
| #include <assert.h> |
| #include <stdio.h> |
| |
| template <class T> |
| class Vector { |
| public: |
| int size; |
| ~Vector() { |
| printf("~V %p %lu\n", &size, sizeof(size)); |
| assert(__msan_test_shadow(&this->size, sizeof(this->size)) == -1); |
| } |
| }; |
| |
| struct Derived { |
| int derived_a; |
| Vector<int> derived_v1; |
| Vector<int> derived_v2; |
| double derived_b; |
| double derived_c; |
| Derived() { |
| derived_a = 5; |
| derived_v1.size = 1; |
| derived_v2.size = 1; |
| derived_b = 7; |
| derived_c = 10; |
| } |
| ~Derived() { |
| printf("~D %p %p %p %lu\n", &derived_a, &derived_v1, &derived_c, sizeof(*this)); |
| assert(__msan_test_shadow(&derived_a, sizeof(derived_a)) == -1); |
| assert(__msan_test_shadow(&derived_v1, sizeof(derived_v1)) == -1); |
| assert(__msan_test_shadow(&derived_v2, sizeof(derived_v2)) == -1); |
| assert(__msan_test_shadow(&derived_b, sizeof(derived_b)) == -1); |
| assert(__msan_test_shadow(&derived_c, sizeof(derived_c)) == -1); |
| } |
| }; |
| |
| int main() { |
| Derived *d = new Derived(); |
| d->~Derived(); |
| |
| assert(__msan_test_shadow(&d->derived_a, sizeof(d->derived_a)) != -1); |
| assert(__msan_test_shadow(&d->derived_v1, sizeof(d->derived_v1)) != -1); |
| assert(__msan_test_shadow(&d->derived_v2, sizeof(d->derived_v2)) != -1); |
| assert(__msan_test_shadow(&d->derived_b, sizeof(d->derived_b)) != -1); |
| assert(__msan_test_shadow(&d->derived_c, sizeof(d->derived_c)) != -1); |
| |
| return 0; |
| } |