| // 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; |
| } |