1 // RUN: %clangxx -fsanitize=realtime %s -o %t 2 // RUN: %env_rtsan_opts="halt_on_error=false,print_stats_on_exit=true" %run %t 2>&1 | FileCheck %s 3 // RUN: %env_rtsan_opts="halt_on_error=true,print_stats_on_exit=true" not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-HALT 4 // RUN: %env_rtsan_opts="suppressions=%s.supp,print_stats_on_exit=true" not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-SUPPRESSIONS 5 6 // UNSUPPORTED: ios 7 8 // Intent: Ensure exits stats are printed on exit. 9 10 #include <unistd.h> 11 12 void violation() [[clang::nonblocking]] { 13 const int kNumViolations = 10; 14 for (int i = 0; i < kNumViolations; i++) { 15 usleep(1); 16 } 17 } 18 19 int main() { 20 violation(); 21 return 0; 22 } 23 24 // CHECK: RealtimeSanitizer exit stats: 25 // CHECK-NEXT: Total error count: 10 26 // CHECK-NEXT: Unique error count: 1 27 // CHECK-NOT: Suppression count 28 29 // CHECK-HALT: RealtimeSanitizer exit stats: 30 // CHECK-HALT-NEXT: Total error count: 1 31 // CHECK-HALT-NEXT: Unique error count: 1 32 // CHECK-HALT-NOT: Suppression count 33 34 // We pass in intentionally_non_existant_function in the suppressions file 35 // This is just to ensure we only get the "Suppression count" metric if this 36 // file is passed at runtime, otherwise that statistic is omitted 37 // CHECK-SUPPRESSIONS: RealtimeSanitizer exit stats: 38 // CHECK-SUPPRESSIONS-NEXT: Total error count: 1 39 // CHECK-SUPPRESSIONS-NEXT: Unique error count: 1 40 // CHECK-SUPPRESSIONS-NEXT: Suppression count: 0 41