12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_msan -m64 -DERROR %s -o %t && not %run %t 2>&1 | \
22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-NOCB
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_msan -m64 -DERROR -DMSANCB_SET %s -o %t && not %run %t 2>&1 | \
42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-CB
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_msan -m64 -DERROR -DMSANCB_SET -DMSANCB_CLEAR %s -o %t && not %run %t 2>&1 | \
62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-NOCB
72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_msan -m64 -DMSANCB_SET %s -o %t && %run %t 2>&1 | \
82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-NOCB
92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <sanitizer/msan_interface.h>
112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdio.h>
122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdlib.h>
132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid cb(void) {
152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  fprintf(stderr, "msan-death-callback\n");
162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint main(int argc, char **argv) {
192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int *volatile p = (int *)malloc(sizeof(int));
202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  *p = 42;
212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  free(p);
222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef MSANCB_SET
242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_death_callback(cb);
252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef MSANCB_CLEAR
282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_death_callback(0);
292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef ERROR
322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (*p)
332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    exit(0);
342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // CHECK-CB: msan-death-callback
362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // CHECK-NOCB-NOT: msan-death-callback
372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  fprintf(stderr, "done\n");
382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return 0;
392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
40