1// RUN: %clangxx -fsanitize=realtime %s -o %t
2// RUN: %env_rtsan_opts=halt_on_error=false %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-NOSUPPRESSIONS
3// RUN: %env_rtsan_opts=suppressions='%s.supp':print_stats_on_exit=true not %run %t 2>&1 | FileCheck %s
4// UNSUPPORTED: ios
5
6// Intent: Ensure that suppressions work as intended
7
8#include <stdio.h>
9#include <stdlib.h>
10#include <unistd.h>
11
12#include <atomic>
13#include <vector>
14
15std::atomic<int> cas_atomic{0};
16
17void *MallocViolation() { return malloc(size: 10); }
18
19void VectorViolations() {
20 // All of these should be suppressed by *vector*
21 std::vector<int> v(10);
22 v.resize(new_size: 20);
23 v.clear();
24 v.resize(new_size: 0);
25 v.push_back(x: 1);
26 v.reserve(n: 10);
27}
28
29void BlockFunc() [[clang::blocking]] {
30 int expected = 0;
31 while (!cas_atomic.compare_exchange_weak(i1&: expected, i2: 1)) {
32 expected = cas_atomic.load();
33 }
34}
35
36void *process() [[clang::nonblocking]] {
37 void *ptr = MallocViolation(); // Suppressed call-stack-contains
38 VectorViolations(); // Suppressed call-stack-contains with regex
39 BlockFunc(); // Suppressed function-name-matches
40 free(ptr: ptr); // Suppressed function-name-matches
41
42 // This is the one that should abort the program
43 // Everything else is suppressed
44 usleep(useconds: 1);
45
46 return ptr;
47}
48
49int main() {
50 process();
51 return 0;
52}
53
54// CHECK-NOT: failed to open suppressions file
55// CHECK: Intercepted call to real-time unsafe function
56// CHECK-SAME: usleep
57
58// CHECK-NOT: Intercepted call to real-time unsafe function
59// CHECK-NOT: malloc
60// CHECK-NOT: vector
61// CHECK-NOT: free
62// CHECK-NOT: BlockFunc
63
64// CHECK: RealtimeSanitizer exit stats:
65// CHECK: Suppression count: 7
66
67// CHECK-NOSUPPRESSIONS: malloc
68// CHECK-NOSUPPRESSIONS: vector
69// CHECK-NOSUPPRESSIONS: free
70// CHECK-NOSUPPRESSIONS: BlockFunc
71// CHECK-NOSUPPRESSIONS: usleep
72

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