blob: a6e29e78ff3808e813c9454854e7cac5609d84c3 [file] [log] [blame]
Ted Kremenek722398f2012-08-24 20:39:55 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=alpha.unix.PthreadLock -verify %s
Jordy Rosed9c52212011-07-19 20:21:41 +00002
3// Tests performing normal locking patterns and wrong locking orders
4
Jordan Rose59801402014-09-10 16:17:42 +00005#include "Inputs/system-header-simulator-for-pthread-lock.h"
Jordy Rosed9c52212011-07-19 20:21:41 +00006
7pthread_mutex_t mtx1, mtx2;
Jordan Rose59801402014-09-10 16:17:42 +00008pthread_mutex_t *pmtx;
Jordy Rosed9c52212011-07-19 20:21:41 +00009lck_mtx_t lck1, lck2;
Jordan Rose7fcaa142014-04-01 03:40:47 +000010lck_grp_t grp1;
Jordy Rosed9c52212011-07-19 20:21:41 +000011
Jordan Rose3a176ed2014-04-01 03:40:53 +000012#define NULL 0
13
Jordy Rosed9c52212011-07-19 20:21:41 +000014void
15ok1(void)
16{
17 pthread_mutex_lock(&mtx1); // no-warning
18}
19
20void
21ok2(void)
22{
23 pthread_mutex_unlock(&mtx1); // no-warning
24}
25
26void
27ok3(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
35void
36ok4(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
44void
45ok5(void)
46{
47 if (pthread_mutex_trylock(&mtx1) == 0) // no-warning
48 pthread_mutex_unlock(&mtx1); // no-warning
49}
50
51void
52ok6(void)
53{
54 lck_mtx_lock(&lck1); // no-warning
55}
56
57void
58ok7(void)
59{
60 if (lck_mtx_try_lock(&lck1) != 0) // no-warning
61 lck_mtx_unlock(&lck1); // no-warning
62}
63
64void
Jordan Rose0696bb42014-04-01 03:40:38 +000065ok8(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
73void
74ok9(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
81void
82ok10(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
89void
Jordan Rose7fcaa142014-04-01 03:40:47 +000090ok11(void)
91{
92 pthread_mutex_destroy(&mtx1); // no-warning
93}
94
95void
96ok12(void)
97{
98 pthread_mutex_destroy(&mtx1); // no-warning
99 pthread_mutex_destroy(&mtx2); // no-warning
100}
101
102void
103ok13(void)
104{
105 pthread_mutex_unlock(&mtx1); // no-warning
106 pthread_mutex_destroy(&mtx1); // no-warning
107}
108
109void
110ok14(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
118void
119ok15(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
126void
Jordan Rose3a176ed2014-04-01 03:40:53 +0000127ok16(void)
128{
129 pthread_mutex_init(&mtx1, NULL); // no-warning
130}
131
132void
133ok17(void)
134{
135 pthread_mutex_init(&mtx1, NULL); // no-warning
136 pthread_mutex_init(&mtx2, NULL); // no-warning
137}
138
139void
140ok18(void)
141{
142 pthread_mutex_destroy(&mtx1); // no-warning
143 pthread_mutex_init(&mtx1, NULL); // no-warning
144}
145
146void
147ok19(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
155void
156ok20(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
165void
Jordan Rose59801402014-09-10 16:17:42 +0000166ok21(void) {
167 pthread_mutex_lock(pmtx); // no-warning
168 pthread_mutex_unlock(pmtx); // no-warning
169}
170
171void
172ok22(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
180void
Jordy Rosed9c52212011-07-19 20:21:41 +0000181bad1(void)
182{
183 pthread_mutex_lock(&mtx1); // no-warning
184 pthread_mutex_lock(&mtx1); // expected-warning{{This lock has already been acquired}}
185}
186
187void
188bad2(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
196void
197bad3(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
205void
206bad4(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
214void
215bad5(void)
216{
217 lck_mtx_lock(&lck1); // no-warning
218 lck_mtx_lock(&lck1); // expected-warning{{This lock has already been acquired}}
219}
220
221void
222bad6(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
230void
231bad7(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
239void
240bad8(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}
Jordan Rose0696bb42014-04-01 03:40:38 +0000247
248void
249bad9(void)
250{
251 lck_mtx_unlock(&lck1); // no-warning
252 lck_mtx_unlock(&lck1); // expected-warning{{This lock has already been unlocked}}
253}
254
255void
256bad10(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
263static void
264bad11_sub(pthread_mutex_t *lock)
265{
266 lck_mtx_unlock(lock); // expected-warning{{This lock has already been unlocked}}
267}
268
269void
270bad11(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
278void
279bad12(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
288void
289bad13(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
298void
299bad14(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
308void
309bad15(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}
Jordan Rose7fcaa142014-04-01 03:40:47 +0000318
319void
320bad16(void)
321{
322 pthread_mutex_destroy(&mtx1); // no-warning
323 pthread_mutex_lock(&mtx1); // expected-warning{{This lock has already been destroyed}}
324}
325
326void
327bad17(void)
328{
329 pthread_mutex_destroy(&mtx1); // no-warning
330 pthread_mutex_unlock(&mtx1); // expected-warning{{This lock has already been destroyed}}
331}
332
333void
334bad18(void)
335{
336 pthread_mutex_destroy(&mtx1); // no-warning
337 pthread_mutex_destroy(&mtx1); // expected-warning{{This lock has already been destroyed}}
338}
339
340void
341bad19(void)
342{
343 pthread_mutex_lock(&mtx1); // no-warning
344 pthread_mutex_destroy(&mtx1); // expected-warning{{This lock is still locked}}
345}
346
347void
348bad20(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
354void
355bad21(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
361void
362bad22(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
368void
369bad23(void)
370{
371 lck_mtx_lock(&mtx1); // no-warning
372 lck_mtx_destroy(&mtx1, &grp1); // expected-warning{{This lock is still locked}}
373}
Jordan Rose3a176ed2014-04-01 03:40:53 +0000374
375void
376bad24(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
382void
383bad25(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
389void
390bad26(void)
391{
392 pthread_mutex_unlock(&mtx1); // no-warning
393 pthread_mutex_init(&mtx1, NULL); // expected-warning{{This lock has already been initialized}}
394}