xref: /llvm-project/compiler-rt/test/rtsan/exit_stats.cpp (revision 8f8d5f005a937bf8d5244c5bf22906095ff08c70)
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