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