1 // RUN: %clang_cc1 -analyze -analyzer-checker=alpha.unix.PthreadLock -verify %s
2
3 // Tests performing normal locking patterns and wrong locking orders
4
5 #include "Inputs/system-header-simulator-for-pthread-lock.h"
6
7 pthread_mutex_t mtx1, mtx2;
8 pthread_mutex_t *pmtx;
9 lck_mtx_t lck1, lck2;
10 lck_grp_t grp1;
11
12 #define NULL 0
13
14 void
ok1(void)15 ok1(void)
16 {
17 pthread_mutex_lock(&mtx1); // no-warning
18 }
19
20 void
ok2(void)21 ok2(void)
22 {
23 pthread_mutex_unlock(&mtx1); // no-warning
24 }
25
26 void
ok3(void)27 ok3(void)
28 {
29 pthread_mutex_lock(&mtx1); // no-warning
30 pthread_mutex_unlock(&mtx1); // no-warning
31 pthread_mutex_lock(&mtx1); // no-warning
32 pthread_mutex_unlock(&mtx1); // no-warning
33 }
34
35 void
ok4(void)36 ok4(void)
37 {
38 pthread_mutex_lock(&mtx1); // no-warning
39 pthread_mutex_unlock(&mtx1); // no-warning
40 pthread_mutex_lock(&mtx2); // no-warning
41 pthread_mutex_unlock(&mtx2); // no-warning
42 }
43
44 void
ok5(void)45 ok5(void)
46 {
47 if (pthread_mutex_trylock(&mtx1) == 0) // no-warning
48 pthread_mutex_unlock(&mtx1); // no-warning
49 }
50
51 void
ok6(void)52 ok6(void)
53 {
54 lck_mtx_lock(&lck1); // no-warning
55 }
56
57 void
ok7(void)58 ok7(void)
59 {
60 if (lck_mtx_try_lock(&lck1) != 0) // no-warning
61 lck_mtx_unlock(&lck1); // no-warning
62 }
63
64 void
ok8(void)65 ok8(void)
66 {
67 pthread_mutex_lock(&mtx1); // no-warning
68 pthread_mutex_lock(&mtx2); // no-warning
69 pthread_mutex_unlock(&mtx2); // no-warning
70 pthread_mutex_unlock(&mtx1); // no-warning
71 }
72
73 void
ok9(void)74 ok9(void)
75 {
76 pthread_mutex_unlock(&mtx1); // no-warning
77 if (pthread_mutex_trylock(&mtx1) == 0) // no-warning
78 pthread_mutex_unlock(&mtx1); // no-warning
79 }
80
81 void
ok10(void)82 ok10(void)
83 {
84 if (pthread_mutex_trylock(&mtx1) != 0) // no-warning
85 pthread_mutex_lock(&mtx1); // no-warning
86 pthread_mutex_unlock(&mtx1); // no-warning
87 }
88
89 void
ok11(void)90 ok11(void)
91 {
92 pthread_mutex_destroy(&mtx1); // no-warning
93 }
94
95 void
ok12(void)96 ok12(void)
97 {
98 pthread_mutex_destroy(&mtx1); // no-warning
99 pthread_mutex_destroy(&mtx2); // no-warning
100 }
101
102 void
ok13(void)103 ok13(void)
104 {
105 pthread_mutex_unlock(&mtx1); // no-warning
106 pthread_mutex_destroy(&mtx1); // no-warning
107 }
108
109 void
ok14(void)110 ok14(void)
111 {
112 pthread_mutex_unlock(&mtx1); // no-warning
113 pthread_mutex_destroy(&mtx1); // no-warning
114 pthread_mutex_unlock(&mtx2); // no-warning
115 pthread_mutex_destroy(&mtx2); // no-warning
116 }
117
118 void
ok15(void)119 ok15(void)
120 {
121 pthread_mutex_lock(&mtx1); // no-warning
122 pthread_mutex_unlock(&mtx1); // no-warning
123 pthread_mutex_destroy(&mtx1); // no-warning
124 }
125
126 void
ok16(void)127 ok16(void)
128 {
129 pthread_mutex_init(&mtx1, NULL); // no-warning
130 }
131
132 void
ok17(void)133 ok17(void)
134 {
135 pthread_mutex_init(&mtx1, NULL); // no-warning
136 pthread_mutex_init(&mtx2, NULL); // no-warning
137 }
138
139 void
ok18(void)140 ok18(void)
141 {
142 pthread_mutex_destroy(&mtx1); // no-warning
143 pthread_mutex_init(&mtx1, NULL); // no-warning
144 }
145
146 void
ok19(void)147 ok19(void)
148 {
149 pthread_mutex_destroy(&mtx1); // no-warning
150 pthread_mutex_init(&mtx1, NULL); // no-warning
151 pthread_mutex_destroy(&mtx2); // no-warning
152 pthread_mutex_init(&mtx2, NULL); // no-warning
153 }
154
155 void
ok20(void)156 ok20(void)
157 {
158 pthread_mutex_unlock(&mtx1); // no-warning
159 pthread_mutex_destroy(&mtx1); // no-warning
160 pthread_mutex_init(&mtx1, NULL); // no-warning
161 pthread_mutex_destroy(&mtx1); // no-warning
162 pthread_mutex_init(&mtx1, NULL); // no-warning
163 }
164
165 void
ok21(void)166 ok21(void) {
167 pthread_mutex_lock(pmtx); // no-warning
168 pthread_mutex_unlock(pmtx); // no-warning
169 }
170
171 void
ok22(void)172 ok22(void) {
173 pthread_mutex_lock(pmtx); // no-warning
174 pthread_mutex_unlock(pmtx); // no-warning
175 pthread_mutex_lock(pmtx); // no-warning
176 pthread_mutex_unlock(pmtx); // no-warning
177 }
178
179
180 void
bad1(void)181 bad1(void)
182 {
183 pthread_mutex_lock(&mtx1); // no-warning
184 pthread_mutex_lock(&mtx1); // expected-warning{{This lock has already been acquired}}
185 }
186
187 void
bad2(void)188 bad2(void)
189 {
190 pthread_mutex_lock(&mtx1); // no-warning
191 pthread_mutex_unlock(&mtx1); // no-warning
192 pthread_mutex_lock(&mtx1); // no-warning
193 pthread_mutex_lock(&mtx1); // expected-warning{{This lock has already been acquired}}
194 }
195
196 void
bad3(void)197 bad3(void)
198 {
199 pthread_mutex_lock(&mtx1); // no-warning
200 pthread_mutex_lock(&mtx2); // no-warning
201 pthread_mutex_unlock(&mtx1); // expected-warning{{This was not the most recently acquired lock}}
202 pthread_mutex_unlock(&mtx2);
203 }
204
205 void
bad4(void)206 bad4(void)
207 {
208 if (pthread_mutex_trylock(&mtx1)) // no-warning
209 return;
210 pthread_mutex_lock(&mtx2); // no-warning
211 pthread_mutex_unlock(&mtx1); // expected-warning{{This was not the most recently acquired lock}}
212 }
213
214 void
bad5(void)215 bad5(void)
216 {
217 lck_mtx_lock(&lck1); // no-warning
218 lck_mtx_lock(&lck1); // expected-warning{{This lock has already been acquired}}
219 }
220
221 void
bad6(void)222 bad6(void)
223 {
224 lck_mtx_lock(&lck1); // no-warning
225 lck_mtx_unlock(&lck1); // no-warning
226 lck_mtx_lock(&lck1); // no-warning
227 lck_mtx_lock(&lck1); // expected-warning{{This lock has already been acquired}}
228 }
229
230 void
bad7(void)231 bad7(void)
232 {
233 lck_mtx_lock(&lck1); // no-warning
234 lck_mtx_lock(&lck2); // no-warning
235 lck_mtx_unlock(&lck1); // expected-warning{{This was not the most recently acquired lock}}
236 lck_mtx_unlock(&lck2);
237 }
238
239 void
bad8(void)240 bad8(void)
241 {
242 if (lck_mtx_try_lock(&lck1) == 0) // no-warning
243 return;
244 lck_mtx_lock(&lck2); // no-warning
245 lck_mtx_unlock(&lck1); // expected-warning{{This was not the most recently acquired lock}}
246 }
247
248 void
bad9(void)249 bad9(void)
250 {
251 lck_mtx_unlock(&lck1); // no-warning
252 lck_mtx_unlock(&lck1); // expected-warning{{This lock has already been unlocked}}
253 }
254
255 void
bad10(void)256 bad10(void)
257 {
258 lck_mtx_lock(&lck1); // no-warning
259 lck_mtx_unlock(&lck1); // no-warning
260 lck_mtx_unlock(&lck1); // expected-warning{{This lock has already been unlocked}}
261 }
262
263 static void
bad11_sub(pthread_mutex_t * lock)264 bad11_sub(pthread_mutex_t *lock)
265 {
266 lck_mtx_unlock(lock); // expected-warning{{This lock has already been unlocked}}
267 }
268
269 void
bad11(int i)270 bad11(int i)
271 {
272 lck_mtx_lock(&lck1); // no-warning
273 lck_mtx_unlock(&lck1); // no-warning
274 if (i < 5)
275 bad11_sub(&lck1);
276 }
277
278 void
bad12(void)279 bad12(void)
280 {
281 pthread_mutex_lock(&mtx1); // no-warning
282 pthread_mutex_unlock(&mtx1); // no-warning
283 pthread_mutex_lock(&mtx1); // no-warning
284 pthread_mutex_unlock(&mtx1); // no-warning
285 pthread_mutex_unlock(&mtx1); // expected-warning{{This lock has already been unlocked}}
286 }
287
288 void
bad13(void)289 bad13(void)
290 {
291 pthread_mutex_lock(&mtx1); // no-warning
292 pthread_mutex_unlock(&mtx1); // no-warning
293 pthread_mutex_lock(&mtx2); // no-warning
294 pthread_mutex_unlock(&mtx2); // no-warning
295 pthread_mutex_unlock(&mtx1); // expected-warning{{This lock has already been unlocked}}
296 }
297
298 void
bad14(void)299 bad14(void)
300 {
301 pthread_mutex_lock(&mtx1); // no-warning
302 pthread_mutex_lock(&mtx2); // no-warning
303 pthread_mutex_unlock(&mtx2); // no-warning
304 pthread_mutex_unlock(&mtx1); // no-warning
305 pthread_mutex_unlock(&mtx2); // expected-warning{{This lock has already been unlocked}}
306 }
307
308 void
bad15(void)309 bad15(void)
310 {
311 pthread_mutex_lock(&mtx1); // no-warning
312 pthread_mutex_lock(&mtx2); // no-warning
313 pthread_mutex_unlock(&mtx2); // no-warning
314 pthread_mutex_unlock(&mtx1); // no-warning
315 pthread_mutex_lock(&mtx1); // no-warning
316 pthread_mutex_unlock(&mtx2); // expected-warning{{This lock has already been unlocked}}
317 }
318
319 void
bad16(void)320 bad16(void)
321 {
322 pthread_mutex_destroy(&mtx1); // no-warning
323 pthread_mutex_lock(&mtx1); // expected-warning{{This lock has already been destroyed}}
324 }
325
326 void
bad17(void)327 bad17(void)
328 {
329 pthread_mutex_destroy(&mtx1); // no-warning
330 pthread_mutex_unlock(&mtx1); // expected-warning{{This lock has already been destroyed}}
331 }
332
333 void
bad18(void)334 bad18(void)
335 {
336 pthread_mutex_destroy(&mtx1); // no-warning
337 pthread_mutex_destroy(&mtx1); // expected-warning{{This lock has already been destroyed}}
338 }
339
340 void
bad19(void)341 bad19(void)
342 {
343 pthread_mutex_lock(&mtx1); // no-warning
344 pthread_mutex_destroy(&mtx1); // expected-warning{{This lock is still locked}}
345 }
346
347 void
bad20(void)348 bad20(void)
349 {
350 lck_mtx_destroy(&mtx1, &grp1); // no-warning
351 lck_mtx_lock(&mtx1); // expected-warning{{This lock has already been destroyed}}
352 }
353
354 void
bad21(void)355 bad21(void)
356 {
357 lck_mtx_destroy(&mtx1, &grp1); // no-warning
358 lck_mtx_unlock(&mtx1); // expected-warning{{This lock has already been destroyed}}
359 }
360
361 void
bad22(void)362 bad22(void)
363 {
364 lck_mtx_destroy(&mtx1, &grp1); // no-warning
365 lck_mtx_destroy(&mtx1, &grp1); // expected-warning{{This lock has already been destroyed}}
366 }
367
368 void
bad23(void)369 bad23(void)
370 {
371 lck_mtx_lock(&mtx1); // no-warning
372 lck_mtx_destroy(&mtx1, &grp1); // expected-warning{{This lock is still locked}}
373 }
374
375 void
bad24(void)376 bad24(void)
377 {
378 pthread_mutex_init(&mtx1, NULL); // no-warning
379 pthread_mutex_init(&mtx1, NULL); // expected-warning{{This lock has already been initialized}}
380 }
381
382 void
bad25(void)383 bad25(void)
384 {
385 pthread_mutex_lock(&mtx1); // no-warning
386 pthread_mutex_init(&mtx1, NULL); // expected-warning{{This lock is still being held}}
387 }
388
389 void
bad26(void)390 bad26(void)
391 {
392 pthread_mutex_unlock(&mtx1); // no-warning
393 pthread_mutex_init(&mtx1, NULL); // expected-warning{{This lock has already been initialized}}
394 }
395