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