Index: test/msan/dtor-base-access.cc =================================================================== --- /dev/null +++ test/msan/dtor-base-access.cc @@ -0,0 +1,47 @@ +// RUN: %expect_crash %s -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t >%t.out 2>&1 + +// RUN: %expect_crash %s -O1 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t >%t.out 2>&1 + +// RUN: %expect_crash %s -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t >%t.out 2>&1 + +#include +#include + +class Base { + public: + int x; + Base() { + x = 5; + } + virtual ~Base(); +}; + +class Derived : Base { + public: + int y; + Derived() { + y = 10; + } + ~Derived(); +}; + +Base::~Base() { + // ok access its own member + assert(__msan_test_shadow(&this->x, sizeof(this->x)) == -1); + // bad access subclass member: trivial + assert(__msan_test_shadow(&((Derived*)this)->y, sizeof( ((Derived*)this)->y)) != -1); +} + +Derived::~Derived() { + // ok to access its own members + assert(__msan_test_shadow(&this->y, sizeof(this->y)) == -1); + // ok access base class members + assert(__msan_test_shadow(&this->x, sizeof(this->x)) == -1); +} + +int main() { + Derived d; + d.~Derived(); + assert(__msan_test_shadow(&d.y, sizeof(d.y)) != -1); + return 0; +}