1*7c41b5ccSChris Apple // RUN: %clangxx -fsanitize=realtime %s -o %t 2*7c41b5ccSChris Apple // RUN: %env_rtsan_opts="halt_on_error=false" %run %t 2>&1 | FileCheck %s 3*7c41b5ccSChris Apple 4*7c41b5ccSChris Apple // RUN: %clangxx -DTEST_CUSTOM_HANDLER=1 -fsanitize=realtime %s -o %t 5*7c41b5ccSChris Apple // RUN: not %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK-CUSTOM-HANDLER 6*7c41b5ccSChris Apple 7*7c41b5ccSChris Apple // UNSUPPORTED: ios 8*7c41b5ccSChris Apple 9*7c41b5ccSChris Apple // Intent: Make sure we support ReporErrorSummary, including custom handlers 10*7c41b5ccSChris Apple 11*7c41b5ccSChris Apple #include <stdio.h> 12*7c41b5ccSChris Apple #include <stdlib.h> 13*7c41b5ccSChris Apple 14*7c41b5ccSChris Apple #ifdef TEST_CUSTOM_HANDLER 15*7c41b5ccSChris Apple extern "C" void __sanitizer_report_error_summary(const char *error_summary) { 16*7c41b5ccSChris Apple fprintf(stderr, "%s %s\n", "In custom handler! ", error_summary); 17*7c41b5ccSChris Apple } 18*7c41b5ccSChris Apple #endif 19*7c41b5ccSChris Apple 20*7c41b5ccSChris Apple int blocking_call() [[clang::blocking]] { return 0; } 21*7c41b5ccSChris Apple 22*7c41b5ccSChris Apple int main() [[clang::nonblocking]] { 23*7c41b5ccSChris Apple void *ptr = malloc(2); 24*7c41b5ccSChris Apple blocking_call(); 25*7c41b5ccSChris Apple 26*7c41b5ccSChris Apple printf("ptr: %p\n", ptr); // ensure we don't optimize out the malloc 27*7c41b5ccSChris Apple } 28*7c41b5ccSChris Apple 29*7c41b5ccSChris Apple // CHECK: SUMMARY: RealtimeSanitizer: unsafe-library-call 30*7c41b5ccSChris Apple // CHECK: SUMMARY: RealtimeSanitizer: blocking-call 31*7c41b5ccSChris Apple 32*7c41b5ccSChris Apple // CHECK-CUSTOM-HANDLER: In custom handler! SUMMARY: RealtimeSanitizer: unsafe-library-call 33