186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// RUN: %clangxx -O2 %s -o %t && not %run %t 2>&1 | FileCheck %s
2799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
3799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// REQUIRES: stable-runtime
486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#include <sanitizer/common_interface_defs.h>
686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#include <stdio.h>
786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
886277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesvolatile char *zero = 0;
986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
1086277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesvoid Death() {
1186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  fprintf(stderr, "DEATH CALLBACK EXECUTED\n");
1286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}
1386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK: DEATH CALLBACK EXECUTED
1486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
15799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarchar global;
1686277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesvolatile char *sink;
1786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
1886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines__attribute__((noinline))
1986277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesvoid MaybeInit(int *uninitialized) {
2086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  if (zero)
2186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    *uninitialized = 1;
2286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}
2386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
2486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines__attribute__((noinline))
2586277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesvoid Leak() {
2686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  sink = new char[100];  // trigger lsan report.
2786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}
2886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
2986277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesint main(int argc, char **argv) {
3086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  int uninitialized;
3186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  __sanitizer_set_death_callback(Death);
3286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  MaybeInit(&uninitialized);
3386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  if (uninitialized)  // trigger msan report.
34799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    global = 77;
35799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  sink = new char[100];
36799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  delete[] sink;
37799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  global = sink[0];  // use-after-free: trigger asan/tsan report.
3886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  Leak();
3986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  sink = 0;
4086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}
41