|  | // RUN: %clangxx_msan -DERROR %s -o %t && not %run %t 2>&1 | \ | 
|  | // RUN:     FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-NOCB | 
|  | // RUN: %clangxx_msan -DERROR -DMSANCB_SET %s -o %t && not %run %t 2>&1 | \ | 
|  | // RUN:     FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-CB | 
|  | // RUN: %clangxx_msan -DERROR -DMSANCB_SET -DMSANCB_CLEAR %s -o %t && not %run %t 2>&1 | \ | 
|  | // RUN:     FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-NOCB | 
|  | // RUN: %clangxx_msan -DMSANCB_SET %s -o %t && %run %t 2>&1 | \ | 
|  | // RUN:     FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-NOCB | 
|  |  | 
|  | #include <sanitizer/msan_interface.h> | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  |  | 
|  | void cb(void) { | 
|  | fprintf(stderr, "msan-death-callback\n"); | 
|  | } | 
|  |  | 
|  | int main(int argc, char **argv) { | 
|  | int *volatile p = (int *)malloc(sizeof(int)); | 
|  | *p = 42; | 
|  | free(p); | 
|  |  | 
|  | #ifdef MSANCB_SET | 
|  | __msan_set_death_callback(cb); | 
|  | #endif | 
|  |  | 
|  | #ifdef MSANCB_CLEAR | 
|  | __msan_set_death_callback(0); | 
|  | #endif | 
|  |  | 
|  | #ifdef ERROR | 
|  | if (*p) | 
|  | exit(0); | 
|  | #endif | 
|  | // CHECK-CB: msan-death-callback | 
|  | // CHECK-NOCB-NOT: msan-death-callback | 
|  | fprintf(stderr, "done\n"); | 
|  | return 0; | 
|  | } |