1*74989affSNico Weber // RUN: %clangxx %s -o %t && %run %t 2>&1 | FileCheck %s 2*74989affSNico Weber // UNSUPPORTED: android, ubsan 3*74989affSNico Weber 4*74989affSNico Weber #include <stdio.h> 5*74989affSNico Weber #include <stdlib.h> 6*74989affSNico Weber #if defined(__GLIBC_PREREQ) && __GLIBC_PREREQ(2, 2) 7*74989affSNico Weber #include <mcheck.h> 8*74989affSNico Weber #else 9*74989affSNico Weber #define MCHECK_OK 0 10*74989affSNico Weber extern "C" int mcheck(void (*abortfunc)(int mstatus)); 11*74989affSNico Weber extern "C" int mcheck_pedantic(void (*abortfunc)(int mstatus)); 12*74989affSNico Weber extern "C" int mprobe(void *ptr); 13*74989affSNico Weber #endif 14*74989affSNico Weber check_heap()15*74989affSNico Webervoid check_heap() { 16*74989affSNico Weber void *p = malloc(1000); 17*74989affSNico Weber int res = mprobe(p); 18*74989affSNico Weber if (res == MCHECK_OK) 19*74989affSNico Weber printf("Success!\n"); 20*74989affSNico Weber free(p); 21*74989affSNico Weber } 22*74989affSNico Weber main(int argc,char * argv[])23*74989affSNico Weberint main(int argc, char *argv[]) { 24*74989affSNico Weber void *p; 25*74989affSNico Weber if (mcheck(NULL) != 0) { 26*74989affSNico Weber fprintf(stderr, "mcheck() failed\n"); 27*74989affSNico Weber exit(EXIT_FAILURE); 28*74989affSNico Weber } 29*74989affSNico Weber 30*74989affSNico Weber check_heap(); 31*74989affSNico Weber // CHECK: Success! 32*74989affSNico Weber 33*74989affSNico Weber if (mcheck_pedantic(NULL) != 0) { 34*74989affSNico Weber fprintf(stderr, "mcheck_pedantic() failed\n"); 35*74989affSNico Weber exit(EXIT_FAILURE); 36*74989affSNico Weber } 37*74989affSNico Weber 38*74989affSNico Weber check_heap(); 39*74989affSNico Weber // CHECK: Success! 40*74989affSNico Weber 41*74989affSNico Weber return 0; 42*74989affSNico Weber } 43