xref: /llvm-project/compiler-rt/test/msan/dtor-vtable.cpp (revision eb4d22917eb69ba0f41e6e677d64f67f8b426496)
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 Song int 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