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
12void violation() [[clang::nonblocking]] {
13 const int kNumViolations = 10;
14 for (int i = 0; i < kNumViolations; i++) {
15 usleep(useconds: 1);
16 }
17}
18
19int 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

source code of compiler-rt/test/rtsan/exit_stats.cpp