brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.6 KiB · 6074ed5 Raw
71 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#include <sanitizer/msan_interface.h>8#include <assert.h>9 10// TODO: remove empty dtors when msan use-after-dtor poisons11// for trivial classes with undeclared dtors12 13// 24 bytes total14struct Packed {15  // Packed into 4 bytes16  unsigned int a : 1;17  unsigned int b : 1;18  // Force alignment to next 4 bytes19  unsigned int   : 0;20  unsigned int c : 1;21  // Force alignment, 8 more bytes22  double d = 5.0;23  // 4 bytes24  unsigned int e : 1;25  ~Packed() {}26};27 28// 1 byte total29struct Empty {30  unsigned int : 0;31  ~Empty() {}32};33 34// 4 byte total35struct Simple {36  unsigned int a : 1;37  ~Simple() {}38};39 40struct Anon {41  unsigned int a : 1;42  unsigned int b : 2;43  unsigned int   : 0;44  unsigned int c : 1;45  ~Anon() {}46};47 48int main() {49  Packed *p = new Packed();50  p->~Packed();51  for (int i = 0; i < 4; i++)52    assert(__msan_test_shadow(((char*)p) + i, sizeof(char)) != -1);53  assert(__msan_test_shadow(&p->d, sizeof(double)) != -1);54  assert(__msan_test_shadow(((char*)(&p->d)) + sizeof(double), sizeof(char)) !=55         -1);56 57  Empty *e = new Empty();58  e->~Empty();59  assert(__msan_test_shadow(e, sizeof(*e)) != -1);60 61  Simple *s = new Simple();62  s->~Simple();63  assert(__msan_test_shadow(s, sizeof(*s)) != -1);64 65  Anon *a = new Anon();66  a->~Anon();67  assert(__msan_test_shadow(a, sizeof(*a)) != -1);68 69  return 0;70}71