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