diff options
Diffstat (limited to 'compiler-rt/test/msan/death-callback.cpp')
| -rw-r--r-- | compiler-rt/test/msan/death-callback.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/compiler-rt/test/msan/death-callback.cpp b/compiler-rt/test/msan/death-callback.cpp new file mode 100644 index 00000000000..08cf2911b0f --- /dev/null +++ b/compiler-rt/test/msan/death-callback.cpp @@ -0,0 +1,39 @@ +// 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; +} |

