diff options
Diffstat (limited to 'compiler-rt/test/msan/dtor-vtable.cpp')
-rw-r--r-- | compiler-rt/test/msan/dtor-vtable.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/compiler-rt/test/msan/dtor-vtable.cpp b/compiler-rt/test/msan/dtor-vtable.cpp new file mode 100644 index 00000000000..9bbad26092d --- /dev/null +++ b/compiler-rt/test/msan/dtor-vtable.cpp @@ -0,0 +1,68 @@ +// RUN: %clangxx_msan %s -O0 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t + +// RUN: %clangxx_msan %s -O1 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t + +// RUN: %clangxx_msan %s -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t + +// RUN: %clangxx_msan %s -DVPTRA=1 -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 not %run %t + +// RUN: %clangxx_msan %s -DVPTRCA=1 -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 not %run %t + +// RUN: %clangxx_msan %s -DVPTRCB=1 -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 not %run %t + +// RUN: %clangxx_msan %s -DVPTRC=1 -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 not %run %t + +// Expected to quit due to invalid access when invoking +// function using vtable. + +#include <sanitizer/msan_interface.h> +#include <stdio.h> +#include <assert.h> + +class A { +public: + int x; + ~A() {} + virtual void A_Foo() {} +}; + +class B { + public: + int y; + ~B() {} + virtual void B_Foo() {} +}; + +class C : public A, public B { + public: + int z; + ~C() {} + virtual void C_Foo() {} +}; + +int main() { + A *a = new A(); + a->~A(); + + // Shouldn't be allowed to invoke function via vtable. +#ifdef VPTRA + a->A_Foo(); +#endif + + C *c = new C(); + c->~C(); + +#ifdef VPTRCA + c->A_Foo(); +#endif + +#ifdef VPTRCB + c->B_Foo(); +#endif + +#ifdef VPTRC + c->C_Foo(); +#endif + + return 0; +} |