1*eb4d2291SVitaly Buka // RUN: %clangxx_msan %s -O0 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && %run %t 2d21b3d34SFangrui Song 3*eb4d2291SVitaly Buka // RUN: %clangxx_msan %s -O1 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && %run %t 4d21b3d34SFangrui Song 5*eb4d2291SVitaly Buka // RUN: %clangxx_msan %s -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && %run %t 6d21b3d34SFangrui Song 7*eb4d2291SVitaly Buka // RUN: %clangxx_msan %s -DVPTRA=1 -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && not %run %t 8d21b3d34SFangrui Song 9*eb4d2291SVitaly Buka // RUN: %clangxx_msan %s -DVPTRCA=1 -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && not %run %t 10d21b3d34SFangrui Song 11*eb4d2291SVitaly Buka // RUN: %clangxx_msan %s -DVPTRCB=1 -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && not %run %t 12d21b3d34SFangrui Song 13*eb4d2291SVitaly Buka // RUN: %clangxx_msan %s -DVPTRC=1 -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && not %run %t 14d21b3d34SFangrui Song 15d21b3d34SFangrui Song // Expected to quit due to invalid access when invoking 16d21b3d34SFangrui Song // function using vtable. 17d21b3d34SFangrui Song 18d21b3d34SFangrui Song #include <sanitizer/msan_interface.h> 19d21b3d34SFangrui Song #include <stdio.h> 20d21b3d34SFangrui Song #include <assert.h> 21d21b3d34SFangrui Song 22d21b3d34SFangrui Song class A { 23d21b3d34SFangrui Song public: 24d21b3d34SFangrui Song int x; ~A()25d21b3d34SFangrui Song ~A() {} A_Foo()26d21b3d34SFangrui Song virtual void A_Foo() {} 27d21b3d34SFangrui Song }; 28d21b3d34SFangrui Song 29d21b3d34SFangrui Song class B { 30d21b3d34SFangrui Song public: 31d21b3d34SFangrui Song int y; ~B()32d21b3d34SFangrui Song ~B() {} B_Foo()33d21b3d34SFangrui Song virtual void B_Foo() {} 34d21b3d34SFangrui Song }; 35d21b3d34SFangrui Song 36d21b3d34SFangrui Song class C : public A, public B { 37d21b3d34SFangrui Song public: 38d21b3d34SFangrui Song int z; ~C()39d21b3d34SFangrui Song ~C() {} C_Foo()40d21b3d34SFangrui Song virtual void C_Foo() {} 41d21b3d34SFangrui Song }; 42d21b3d34SFangrui Song main()43d21b3d34SFangrui Songint main() { 44d21b3d34SFangrui Song A *a = new A(); 45d21b3d34SFangrui Song a->~A(); 46d21b3d34SFangrui Song 47d21b3d34SFangrui Song // Shouldn't be allowed to invoke function via vtable. 48d21b3d34SFangrui Song #ifdef VPTRA 49d21b3d34SFangrui Song a->A_Foo(); 50d21b3d34SFangrui Song #endif 51d21b3d34SFangrui Song 52d21b3d34SFangrui Song C *c = new C(); 53d21b3d34SFangrui Song c->~C(); 54d21b3d34SFangrui Song 55d21b3d34SFangrui Song #ifdef VPTRCA 56d21b3d34SFangrui Song c->A_Foo(); 57d21b3d34SFangrui Song #endif 58d21b3d34SFangrui Song 59d21b3d34SFangrui Song #ifdef VPTRCB 60d21b3d34SFangrui Song c->B_Foo(); 61d21b3d34SFangrui Song #endif 62d21b3d34SFangrui Song 63d21b3d34SFangrui Song #ifdef VPTRC 64d21b3d34SFangrui Song c->C_Foo(); 65d21b3d34SFangrui Song #endif 66d21b3d34SFangrui Song 67d21b3d34SFangrui Song return 0; 68d21b3d34SFangrui Song } 69