brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.4 KiB · 4c6c66d Raw
69 lines · cpp
1// RUN: %clangxx_msan %s -O0 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && %run %t2 3// RUN: %clangxx_msan %s -O1 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && %run %t4 5// RUN: %clangxx_msan %s -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && %run %t6 7// RUN: %clangxx_msan %s -DVPTRA=1 -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && not %run %t8 9// RUN: %clangxx_msan %s -DVPTRCA=1 -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && not %run %t10 11// RUN: %clangxx_msan %s -DVPTRCB=1 -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && not %run %t12 13// RUN: %clangxx_msan %s -DVPTRC=1 -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && not %run %t14 15// Expected to quit due to invalid access when invoking16// function using vtable.17 18#include <sanitizer/msan_interface.h>19#include <stdio.h>20#include <assert.h>21 22class A {23public:24  int x;25  ~A() {}26  virtual void A_Foo() {}27};28 29class B {30 public:31  int y;32  ~B() {}33  virtual void B_Foo() {}34};35 36class C : public A, public B {37 public:38  int z;39  ~C() {}40  virtual void C_Foo() {}41};42 43int main() {44  A *a = new A();45  a->~A();46 47  // Shouldn't be allowed to invoke function via vtable.48#ifdef VPTRA49  a->A_Foo();50#endif51 52  C *c = new C();53  c->~C();54 55#ifdef VPTRCA56  c->A_Foo();57#endif58 59#ifdef VPTRCB60  c->B_Foo();61#endif62 63#ifdef VPTRC64  c->C_Foo();65#endif66 67  return 0;68}69