]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/Analysis/block-in-critical-section.cpp
Vendor import of clang trunk r290819:
[FreeBSD/FreeBSD.git] / test / Analysis / block-in-critical-section.cpp
1 // RUN: %clang_cc1 -analyze -analyzer-checker=alpha.unix.BlockInCriticalSection -std=c++11 -verify %s
2
3 void sleep(int x) {}
4
5 namespace std {
6 struct mutex {
7   void lock() {}
8   void unlock() {}
9 };
10 }
11
12 void testBlockInCriticalSection() {
13   std::mutex m;
14   m.lock();
15   sleep(3); // expected-warning {{A blocking function %s is called inside a critical section}}
16   m.unlock();
17 }
18
19 void testBlockInCriticalSectionWithNestedMutexes() {
20   std::mutex m, n, k;
21   m.lock();
22   n.lock();
23   k.lock();
24   sleep(3); // expected-warning {{A blocking function %s is called inside a critical section}}
25   k.unlock();
26   sleep(5); // expected-warning {{A blocking function %s is called inside a critical section}}
27   n.unlock();
28   sleep(3); // expected-warning {{A blocking function %s is called inside a critical section}}
29   m.unlock();
30   sleep(3); // no-warning
31 }
32
33 void f() {
34   sleep(1000); // expected-warning {{A blocking function %s is called inside a critical section}}
35 }
36
37 void testBlockInCriticalSectionInterProcedural() {
38   std::mutex m;
39   m.lock();
40   f();
41   m.unlock();
42 }
43
44 void testBlockInCriticalSectionUnexpectedUnlock() {
45   std::mutex m;
46   m.unlock();
47   sleep(1); // no-warning
48   m.lock();
49   sleep(1); // expected-warning {{A blocking function %s is called inside a critical section}}
50 }