| // RUN: %clangxx %s -o %t && %run %t 2>&1 | FileCheck %s |
| // UNSUPPORTED: android, ubsan |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #if defined(__GLIBC_PREREQ) && __GLIBC_PREREQ(2, 2) |
| #include <mcheck.h> |
| #else |
| #define MCHECK_OK 0 |
| extern "C" int mcheck(void (*abortfunc)(int mstatus)); |
| extern "C" int mcheck_pedantic(void (*abortfunc)(int mstatus)); |
| extern "C" int mprobe(void *ptr); |
| #endif |
| |
| void check_heap() { |
| void *p = malloc(1000); |
| int res = mprobe(p); |
| if (res == MCHECK_OK) |
| printf("Success!\n"); |
| free(p); |
| } |
| |
| int main(int argc, char *argv[]) { |
| void *p; |
| if (mcheck(NULL) != 0) { |
| fprintf(stderr, "mcheck() failed\n"); |
| exit(EXIT_FAILURE); |
| } |
| |
| check_heap(); |
| // CHECK: Success! |
| |
| if (mcheck_pedantic(NULL) != 0) { |
| fprintf(stderr, "mcheck_pedantic() failed\n"); |
| exit(EXIT_FAILURE); |
| } |
| |
| check_heap(); |
| // CHECK: Success! |
| |
| return 0; |
| } |