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