• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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