1
- // RUN: %clang_analyze_cc1 -analyzer-checker=alpha.unix.BlockInCriticalSection -std=c++11 -verify %s
1
+ // RUN: %clang_analyze_cc1 \
2
+ // RUN: -analyzer-checker=alpha.unix.BlockInCriticalSection \
3
+ // RUN: -std=c++11 \
4
+ // RUN: -analyzer-output text \
5
+ // RUN: -verify %s
2
6
3
7
void sleep (int x) {}
4
8
@@ -21,7 +25,7 @@ template<typename T>
21
25
struct not_real_lock {
22
26
not_real_lock<T>(std::mutex) {}
23
27
};
24
- }
28
+ } // namespace std
25
29
26
30
void getc () {}
27
31
void fgets () {}
@@ -39,103 +43,139 @@ void mtx_unlock() {}
39
43
40
44
void testBlockInCriticalSectionWithStdMutex () {
41
45
std::mutex m;
42
- m.lock ();
46
+ m.lock (); // expected-note 5{{Entering critical section here}}
43
47
sleep (3 ); // expected-warning {{Call to blocking function 'sleep' inside of critical section}}
48
+ // expected-note@-1 {{Call to blocking function 'sleep' inside of critical section}}
44
49
getc (); // expected-warning {{Call to blocking function 'getc' inside of critical section}}
50
+ // expected-note@-1 {{Call to blocking function 'getc' inside of critical section}}
45
51
fgets (); // expected-warning {{Call to blocking function 'fgets' inside of critical section}}
52
+ // expected-note@-1 {{Call to blocking function 'fgets' inside of critical section}}
46
53
read (); // expected-warning {{Call to blocking function 'read' inside of critical section}}
54
+ // expected-note@-1 {{Call to blocking function 'read' inside of critical section}}
47
55
recv (); // expected-warning {{Call to blocking function 'recv' inside of critical section}}
56
+ // expected-note@-1 {{Call to blocking function 'recv' inside of critical section}}
48
57
m.unlock ();
49
58
}
50
59
51
60
void testBlockInCriticalSectionWithPthreadMutex () {
52
- pthread_mutex_lock ();
61
+ pthread_mutex_lock (); // expected-note 10{{Entering critical section here}}
53
62
sleep (3 ); // expected-warning {{Call to blocking function 'sleep' inside of critical section}}
63
+ // expected-note@-1 {{Call to blocking function 'sleep' inside of critical section}}
54
64
getc (); // expected-warning {{Call to blocking function 'getc' inside of critical section}}
65
+ // expected-note@-1 {{Call to blocking function 'getc' inside of critical section}}
55
66
fgets (); // expected-warning {{Call to blocking function 'fgets' inside of critical section}}
67
+ // expected-note@-1 {{Call to blocking function 'fgets' inside of critical section}}
56
68
read (); // expected-warning {{Call to blocking function 'read' inside of critical section}}
69
+ // expected-note@-1 {{Call to blocking function 'read' inside of critical section}}
57
70
recv (); // expected-warning {{Call to blocking function 'recv' inside of critical section}}
71
+ // expected-note@-1 {{Call to blocking function 'recv' inside of critical section}}
58
72
pthread_mutex_unlock ();
59
73
60
- pthread_mutex_trylock ();
74
+ pthread_mutex_trylock (); // expected-note 5{{Entering critical section here}}
61
75
sleep (3 ); // expected-warning {{Call to blocking function 'sleep' inside of critical section}}
76
+ // expected-note@-1 {{Call to blocking function 'sleep' inside of critical section}}
62
77
getc (); // expected-warning {{Call to blocking function 'getc' inside of critical section}}
78
+ // expected-note@-1 {{Call to blocking function 'getc' inside of critical section}}
63
79
fgets (); // expected-warning {{Call to blocking function 'fgets' inside of critical section}}
80
+ // expected-note@-1 {{Call to blocking function 'fgets' inside of critical section}}
64
81
read (); // expected-warning {{Call to blocking function 'read' inside of critical section}}
82
+ // expected-note@-1 {{Call to blocking function 'read' inside of critical section}}
65
83
recv (); // expected-warning {{Call to blocking function 'recv' inside of critical section}}
84
+ // expected-note@-1 {{Call to blocking function 'recv' inside of critical section}}
66
85
pthread_mutex_unlock ();
67
86
}
68
87
69
88
void testBlockInCriticalSectionC11Locks () {
70
- mtx_lock ();
89
+ mtx_lock (); // expected-note 15{{Entering critical section here}}
71
90
sleep (3 ); // expected-warning {{Call to blocking function 'sleep' inside of critical section}}
91
+ // expected-note@-1 {{Call to blocking function 'sleep' inside of critical section}}
72
92
getc (); // expected-warning {{Call to blocking function 'getc' inside of critical section}}
93
+ // expected-note@-1 {{Call to blocking function 'getc' inside of critical section}}
73
94
fgets (); // expected-warning {{Call to blocking function 'fgets' inside of critical section}}
95
+ // expected-note@-1 {{Call to blocking function 'fgets' inside of critical section}}
74
96
read (); // expected-warning {{Call to blocking function 'read' inside of critical section}}
97
+ // expected-note@-1 {{Call to blocking function 'read' inside of critical section}}
75
98
recv (); // expected-warning {{Call to blocking function 'recv' inside of critical section}}
99
+ // expected-note@-1 {{Call to blocking function 'recv' inside of critical section}}
76
100
mtx_unlock ();
77
101
78
- mtx_timedlock ();
102
+ mtx_timedlock (); // expected-note 10{{Entering critical section here}}
79
103
sleep (3 ); // expected-warning {{Call to blocking function 'sleep' inside of critical section}}
104
+ // expected-note@-1 {{Call to blocking function 'sleep' inside of critical section}}
80
105
getc (); // expected-warning {{Call to blocking function 'getc' inside of critical section}}
106
+ // expected-note@-1 {{Call to blocking function 'getc' inside of critical section}}
81
107
fgets (); // expected-warning {{Call to blocking function 'fgets' inside of critical section}}
108
+ // expected-note@-1 {{Call to blocking function 'fgets' inside of critical section}}
82
109
read (); // expected-warning {{Call to blocking function 'read' inside of critical section}}
110
+ // expected-note@-1 {{Call to blocking function 'read' inside of critical section}}
83
111
recv (); // expected-warning {{Call to blocking function 'recv' inside of critical section}}
112
+ // expected-note@-1 {{Call to blocking function 'recv' inside of critical section}}
84
113
mtx_unlock ();
85
114
86
- mtx_trylock ();
115
+ mtx_trylock (); // expected-note 5{{Entering critical section here}}
87
116
sleep (3 ); // expected-warning {{Call to blocking function 'sleep' inside of critical section}}
117
+ // expected-note@-1 {{Call to blocking function 'sleep' inside of critical section}}
88
118
getc (); // expected-warning {{Call to blocking function 'getc' inside of critical section}}
119
+ // expected-note@-1 {{Call to blocking function 'getc' inside of critical section}}
89
120
fgets (); // expected-warning {{Call to blocking function 'fgets' inside of critical section}}
121
+ // expected-note@-1 {{Call to blocking function 'fgets' inside of critical section}}
90
122
read (); // expected-warning {{Call to blocking function 'read' inside of critical section}}
123
+ // expected-note@-1 {{Call to blocking function 'read' inside of critical section}}
91
124
recv (); // expected-warning {{Call to blocking function 'recv' inside of critical section}}
125
+ // expected-note@-1 {{Call to blocking function 'recv' inside of critical section}}
92
126
mtx_unlock ();
93
127
}
94
128
95
129
void testBlockInCriticalSectionWithNestedMutexes () {
96
130
std::mutex m, n, k;
97
- m.lock ();
98
- n.lock ();
99
- k.lock ();
131
+ m.lock (); // expected-note 3{{Entering critical section here}}
132
+ n.lock (); // expected-note 3{{Entering critical section here}}
133
+ k.lock (); // expected-note 3{{Entering critical section here}}
100
134
sleep (3 ); // expected-warning {{Call to blocking function 'sleep' inside of critical section}}
135
+ // expected-note@-1 {{Call to blocking function 'sleep' inside of critical section}}
101
136
k.unlock ();
102
137
sleep (5 ); // expected-warning {{Call to blocking function 'sleep' inside of critical section}}
138
+ // expected-note@-1 {{Call to blocking function 'sleep' inside of critical section}}
103
139
n.unlock ();
104
140
sleep (3 ); // expected-warning {{Call to blocking function 'sleep' inside of critical section}}
141
+ // expected-note@-1 {{Call to blocking function 'sleep' inside of critical section}}
105
142
m.unlock ();
106
143
sleep (3 ); // no-warning
107
144
}
108
145
109
146
void f () {
110
147
sleep (1000 ); // expected-warning {{Call to blocking function 'sleep' inside of critical section}}
148
+ // expected-note@-1 {{Call to blocking function 'sleep' inside of critical section}}
111
149
}
112
150
113
151
void testBlockInCriticalSectionInterProcedural () {
114
152
std::mutex m;
115
- m.lock ();
116
- f ();
153
+ m.lock (); // expected-note {{Entering critical section here}}
154
+ f (); // expected-note {{Calling 'f'}}
117
155
m.unlock ();
118
156
}
119
157
120
158
void testBlockInCriticalSectionUnexpectedUnlock () {
121
159
std::mutex m;
122
160
m.unlock ();
123
161
sleep (1 ); // no-warning
124
- m.lock ();
162
+ m.lock (); // expected-note {{Entering critical section here}}
125
163
sleep (1 ); // expected-warning {{Call to blocking function 'sleep' inside of critical section}}
164
+ // expected-note@-1 {{Call to blocking function 'sleep' inside of critical section}}
126
165
}
127
166
128
167
void testBlockInCriticalSectionLockGuard () {
129
168
std::mutex g_mutex;
130
169
std::not_real_lock<std::mutex> not_real_lock (g_mutex);
131
170
sleep (1 ); // no-warning
132
171
133
- std::lock_guard<std::mutex> lock (g_mutex);
172
+ std::lock_guard<std::mutex> lock (g_mutex); // expected-note {{Entering critical section here}}
134
173
sleep (1 ); // expected-warning {{Call to blocking function 'sleep' inside of critical section}}
174
+ // expected-note@-1 {{Call to blocking function 'sleep' inside of critical section}}
135
175
}
136
176
137
177
void testBlockInCriticalSectionLockGuardNested () {
138
- testBlockInCriticalSectionLockGuard ();
178
+ testBlockInCriticalSectionLockGuard (); // expected-note {{Calling 'testBlockInCriticalSectionLockGuard'}}
139
179
sleep (1 ); // no-warning
140
180
}
141
181
@@ -144,11 +184,12 @@ void testBlockInCriticalSectionUniqueLock() {
144
184
std::not_real_lock<std::mutex> not_real_lock (g_mutex);
145
185
sleep (1 ); // no-warning
146
186
147
- std::unique_lock<std::mutex> lock (g_mutex);
187
+ std::unique_lock<std::mutex> lock (g_mutex); // expected-note {{Entering critical section here}}
148
188
sleep (1 ); // expected-warning {{Call to blocking function 'sleep' inside of critical section}}
189
+ // expected-note@-1 {{Call to blocking function 'sleep' inside of critical section}}
149
190
}
150
191
151
192
void testBlockInCriticalSectionUniqueLockNested () {
152
- testBlockInCriticalSectionUniqueLock ();
193
+ testBlockInCriticalSectionUniqueLock (); // expected-note {{Calling 'testBlockInCriticalSectionUniqueLock'}}
153
194
sleep (1 ); // no-warning
154
195
}
0 commit comments