diff options
Diffstat (limited to 'test/msan/death-callback.cc')
-rw-r--r-- | test/msan/death-callback.cc | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/test/msan/death-callback.cc b/test/msan/death-callback.cc new file mode 100644 index 0000000000000..6d04883399987 --- /dev/null +++ b/test/msan/death-callback.cc @@ -0,0 +1,39 @@ +// RUN: %clangxx_msan -m64 -DERROR %s -o %t && not %run %t 2>&1 | \ +// RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-NOCB +// RUN: %clangxx_msan -m64 -DERROR -DMSANCB_SET %s -o %t && not %run %t 2>&1 | \ +// RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-CB +// RUN: %clangxx_msan -m64 -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 -m64 -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; +} |