warn-thread-safety-analysis.cpp revision 99107ebc0a5aea953b736e12757e0919d5249d43
13ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski// RUN: %clang_cc1 -fsyntax-only -verify -Wthread-safety %s 23ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 33ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 43ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski//-----------------------------------------// 53ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski// Helper fields 63ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski//-----------------------------------------// 73ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 83ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 93ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskiclass __attribute__((lockable)) Mutex { 103ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski public: 113ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski void Lock() __attribute__((exclusive_lock_function)); 123ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski void ReaderLock() __attribute__((shared_lock_function)); 133ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski void Unlock() __attribute__((unlock_function)); 143ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski bool TryLock() __attribute__((exclusive_trylock_function(true))); 153ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski bool ReaderTryLock() __attribute__((shared_trylock_function(true))); 163ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski void LockWhen(const int &cond) __attribute__((exclusive_lock_function)); 173ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}; 183ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 193ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 203ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiMutex sls_mu; 213ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 223ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiMutex sls_mu2 __attribute__((acquired_after(sls_mu))); 233ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskiint sls_guard_var __attribute__((guarded_var)) = 0; 243ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskiint sls_guardby_var __attribute__((guarded_by(sls_mu))) = 0; 253ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 263ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskibool getBool(); 273ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 283ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskiclass MutexWrapper { 293ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskipublic: 303ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski Mutex mu; 313ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski // int x __attribute__((guarded_by(mu))); // FIXME: scoping error 323ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}; 333ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 343ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiMutexWrapper sls_mw; 353ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 363ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_0() { 373ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mw.mu.Lock(); 383ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski // sls_mw.x = 5; // FIXME: turn mu into sls_mw.mu 393ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mw.mu.Unlock(); 403ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 413ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 423ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_2() { 433ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 443ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski int x = sls_guard_var; 453ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 463ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 473ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 483ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_3() { 493ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 503ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_guard_var = 2; 513ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 523ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 533ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 543ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_4() { 553ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu2.Lock(); 563ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_guard_var = 2; 573ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu2.Unlock(); 583ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 593ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 603ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_5() { 613ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 623ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski int x = sls_guardby_var; 633ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 643ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 653ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 663ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_6() { 673ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 683ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_guardby_var = 2; 693ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 703ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 713ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 723ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_7() { 733ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 743ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu2.Lock(); 753ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu2.Unlock(); 763ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 773ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 783ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 793ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_8() { 803ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 813ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) 823ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 833ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski else 843ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 853ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 863ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 873ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_9() { 883ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) 893ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 903ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski else 913ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 923ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 933ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 943ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 953ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_good_6() { 963ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 973ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 983ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } else { 993ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 1003ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski getBool(); // EMPTY 1013ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } else { 1023ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski getBool(); // EMPTY 1033ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1043ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1053ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1063ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1073ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1083ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1093ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_good_7() { 1103ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1113ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski while (getBool()) { 1123ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1133ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 1143ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 1153ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1163ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski continue; 1173ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1183ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1193ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1203ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1213ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1223ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1233ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1243ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_1() { 1253ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); // \ 1268bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{unlocking 'sls_mu' that was not locked}} 1273ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1283ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1293ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_2() { 1303ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1313ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 1328bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{locking 'sls_mu' that is already locked}} 1333ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1343ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1353ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1363ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_3() { 1373ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 1388bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{mutex 'sls_mu' is still held at the end of function 'sls_fun_bad_3'}} 1393ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1403ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1413ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_4() { 1423ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) 1433ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 1448bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{mutex 'sls_mu' is still held at the end of its scope}} 1453ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski else 1463ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu2.Lock(); // \ 1478bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{mutex 'sls_mu2' is still held at the end of its scope}} 1483ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1493ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1503ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_5() { 1513ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 1528bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{mutex 'sls_mu' is still held at the end of its scope}} 1533ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) 1543ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1553ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1563ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1573ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_6() { 1583ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 1593ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 1608bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{mutex 'sls_mu' is still held at the end of its scope}} 1613ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } else { 1623ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 1633ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski getBool(); // EMPTY 1643ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } else { 1653ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski getBool(); // EMPTY 1663ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1673ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1683ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); // \ 1698bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{unlocking 'sls_mu' that was not locked}} 1703ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1713ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1723ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_7() { 1733ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1743ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski while (getBool()) { // \ 1758bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{expecting lock on 'sls_mu' to be held at start of each loop}} 1763ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1773ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 1783ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski if (getBool()) { 1793ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski continue; 1803ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1813ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1823ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 1838bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{mutex 'sls_mu' is still held at the end of its scope}} 1843ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 1853ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 1863ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1873ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1883ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_8() { 1893ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); 1903ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski do { 1913ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); // \ 1928bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{expecting lock on 'sls_mu' to be held at start of each loop}} 1933ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } while (getBool()); 1943ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 1953ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 1963ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_9() { 1973ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski do { 1983ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 1998bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{mutex 'sls_mu' is still held at the end of its scope}} 2003ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } while (getBool()); 2013ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 2023ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2033ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2043ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_10() { 2053ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 2068bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{mutex 'sls_mu' is still held at the end of function 'sls_fun_bad_10'}} 2073ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski while(getBool()) { // \ 2088bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{expecting lock on 'sls_mu' to be held at start of each loop}} 2093ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); 2103ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 2113ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2123ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2133ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid sls_fun_bad_11() { 2143ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski while (getBool()) { 2153ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Lock(); // \ 2168bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{mutex 'sls_mu' is still held at the end of its scope}} 2173ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski } 2183ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski sls_mu.Unlock(); // \ 2198bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{unlocking 'sls_mu' that was not locked}} 2203ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2213ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2223ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski//-----------------------------------------// 2233ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski// Handling lock expressions in attribute args 2243ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski// -------------------------------------------// 2253ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2263ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiMutex aa_mu; 2273ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2283ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskiclass GlobalLocker { 2293ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskipublic: 2303ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski void globalLock() __attribute__((exclusive_lock_function(aa_mu))); 2313ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski void globalUnlock() __attribute__((unlock_function(aa_mu))); 2323ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski}; 2333ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2343ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin SadowskiGlobalLocker glock; 2353ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2363ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid aa_fun_1() { 2373ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalLock(); 2383ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalUnlock(); 2393ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2403ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2413ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid aa_fun_bad_1() { 2423ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalUnlock(); // \ 2438bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{unlocking 'aa_mu' that was not locked}} 2443ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2453ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2463ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid aa_fun_bad_2() { 2473ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalLock(); 2483ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalLock(); // \ 2498bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{locking 'aa_mu' that is already locked}} 2503ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalUnlock(); 2513ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 2523ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski 2533ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowskivoid aa_fun_bad_3() { 2543ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski glock.globalLock(); // \ 2558bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{mutex 'aa_mu' is still held at the end of function 'aa_fun_bad_3'}} 2563ac1fbc303d22af2e11a14023ecee7bd7b7d0bfdCaitlin Sadowski} 257b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 258b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski//--------------------------------------------------// 259b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski// Regression tests for unusual method names 260b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski//--------------------------------------------------// 261b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 262b4d0a9678f8c592990593233e64c59247f40a74aCaitlin SadowskiMutex wmu; 263b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 264b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski// Test diagnostics for other method names. 265b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowskiclass WeirdMethods { 266b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski WeirdMethods() { 267b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski wmu.Lock(); // \ 2688bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{mutex 'wmu' is still held at the end of function 'WeirdMethods'}} 269b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 270b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski ~WeirdMethods() { 271b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski wmu.Lock(); // \ 2728bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{mutex 'wmu' is still held at the end of function '~WeirdMethods'}} 273b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 274b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski void operator++() { 275b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski wmu.Lock(); // \ 2768bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{mutex 'wmu' is still held at the end of function 'operator++'}} 277b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 278b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski operator int*() { 279b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski wmu.Lock(); // \ 2808bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{mutex 'wmu' is still held at the end of function 'operator int *'}} 281b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski return 0; 282b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski } 283b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski}; 284b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 28505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski//-----------------------------------------------// 28605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski// Errors for guarded by or guarded var variables 28705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski// ----------------------------------------------// 28805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 28905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskiint *pgb_gvar __attribute__((pt_guarded_var)); 29005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskiint *pgb_var __attribute__((pt_guarded_by(sls_mu))); 29105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 29205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskiclass PGBFoo { 29305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski public: 29405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x; 29505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int *pgb_field __attribute__((guarded_by(sls_mu2))) 29605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski __attribute__((pt_guarded_by(sls_mu))); 29705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski void testFoo() { 29805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski pgb_field = &x; // \ 2998bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{writing variable 'pgb_field' requires lock on 'sls_mu2' to be held exclusively}} 3008bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski *pgb_field = x; // expected-warning {{reading variable 'pgb_field' requires lock on 'sls_mu2' to be held}} \ 3018bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{writing the value pointed to by 'pgb_field' requires lock on 'sls_mu' to be held exclusively}} 3028bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski x = *pgb_field; // expected-warning {{reading variable 'pgb_field' requires lock on 'sls_mu2' to be held}} \ 3038bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{reading the value pointed to by 'pgb_field' requires lock on 'sls_mu' to be held}} 3048bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski (*pgb_field)++; // expected-warning {{reading variable 'pgb_field' requires lock on 'sls_mu2' to be held}} \ 3058bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{writing the value pointed to by 'pgb_field' requires lock on 'sls_mu' to be held exclusively}} 30605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski } 30705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}; 30805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 30905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskiclass GBFoo { 31005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski public: 31105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int gb_field __attribute__((guarded_by(sls_mu))); 31205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 31305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski void testFoo() { 31405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski gb_field = 0; // \ 3158bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{writing variable 'gb_field' requires lock on 'sls_mu' to be held exclusively}} 31605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski } 317af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski 318af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski void testNoAnal() __attribute__((no_thread_safety_analysis)) { 319af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski gb_field = 0; 320af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski } 32105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski}; 32205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 32305b436ef550837e2141c55c590fb16010b8658d8Caitlin SadowskiGBFoo GlobalGBFoo __attribute__((guarded_by(sls_mu))); 32405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 32505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_fun_0() { 32605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_mu.Lock(); 32705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x = *pgb_var; 32805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_mu.Unlock(); 32905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 33005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 33105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_fun_1() { 33205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_mu.Lock(); 33305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski *pgb_var = 2; 33405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_mu.Unlock(); 33505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 33605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 33705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_fun_2() { 33805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x; 33905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski pgb_var = &x; 34005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 34105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 34205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_fun_3() { 34305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int *x = pgb_var; 34405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 34505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 34605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_0() { 34705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_guard_var = 1; // \ 348a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski // expected-warning{{writing variable 'sls_guard_var' requires lock on 'any mutex' to be held exclusively}} 34905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 35005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 35105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_1() { 35205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x = sls_guard_var; // \ 353a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski // expected-warning{{reading variable 'sls_guard_var' requires lock on 'any mutex' to be held}} 35405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 35505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 35605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_2() { 35705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_guardby_var = 1; // \ 3588bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{writing variable 'sls_guardby_var' requires lock on 'sls_mu' to be held exclusively}} 35905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 36005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 36105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_3() { 36205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x = sls_guardby_var; // \ 3638bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{reading variable 'sls_guardby_var' requires lock on 'sls_mu' to be held}} 36405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 36505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 36605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_4() { 36705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski *pgb_gvar = 1; // \ 368a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski // expected-warning {{writing the value pointed to by 'pgb_gvar' requires lock on 'any mutex' to be held exclusively}} 36905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 37005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 37105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_5() { 37205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x = *pgb_gvar; // \ 373a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski // expected-warning {{reading the value pointed to by 'pgb_gvar' requires lock on 'any mutex' to be held}} 37405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 37505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 37605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_6() { 37705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski *pgb_var = 1; // \ 3788bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{writing the value pointed to by 'pgb_var' requires lock on 'sls_mu' to be held exclusively}} 37905b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 38005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 38105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_7() { 38205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski int x = *pgb_var; // \ 3838bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{reading the value pointed to by 'pgb_var' requires lock on 'sls_mu' to be held}} 38405b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 38505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 38605b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_8() { 38705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski GBFoo G; 38805b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski G.gb_field = 0; // \ 3898bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{writing variable 'gb_field' requires lock on 'sls_mu'}} 39005b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 39105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski 39205b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowskivoid gb_bad_9() { 39305b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_guard_var++; // \ 394a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski // expected-warning{{writing variable 'sls_guard_var' requires lock on 'any mutex' to be held exclusively}} 39505b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski sls_guard_var--; // \ 396a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski // expected-warning{{writing variable 'sls_guard_var' requires lock on 'any mutex' to be held exclusively}} 39705b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski ++sls_guard_var; // \ 398a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski // expected-warning{{writing variable 'sls_guard_var' requires lock on 'any mutex' to be held exclusively}} 399a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski --sls_guard_var;// \ 400a49d1d8a34381802040c3d7fa218e93b457d2b1dCaitlin Sadowski // expected-warning{{writing variable 'sls_guard_var' requires lock on 'any mutex' to be held exclusively}} 40105b436ef550837e2141c55c590fb16010b8658d8Caitlin Sadowski} 402b4d0a9678f8c592990593233e64c59247f40a74aCaitlin Sadowski 403eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski//-----------------------------------------------// 404eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski// Warnings on variables with late parsed attributes 405eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski// ----------------------------------------------// 406eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 407eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowskiclass LateFoo { 408eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowskipublic: 409eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski int a __attribute__((guarded_by(mu))); 410eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski int b; 411eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 412eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski void foo() __attribute__((exclusive_locks_required(mu))) { } 413eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 414eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski void test() { 415eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski a = 0; // \ 4168bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning{{writing variable 'a' requires lock on 'mu' to be held exclusively}} 417eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski b = a; // \ 4188bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{reading variable 'a' requires lock on 'mu' to be held}} 419eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski c = 0; // \ 4208bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{writing variable 'c' requires lock on 'mu' to be held exclusively}} 421eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski } 422eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 423eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski int c __attribute__((guarded_by(mu))); 424eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 425eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski Mutex mu; 426eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski}; 427eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 42899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskiclass LateBar { 42999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski public: 43099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski int a_ __attribute__((guarded_by(mu1_))); 43199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski int b_; 43299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski int *q __attribute__((pt_guarded_by(mu))); 43399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski Mutex mu1_; 43499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski Mutex mu; 43599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo Foo; 43699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo Foo2; 43799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo *FooPointer; 43899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski}; 43999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 44099107ebc0a5aea953b736e12757e0919d5249d43Caitlin SadowskiLateBar b1, *b3; 44199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 44299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_0() { 44399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo FooA; 44499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo FooB; 44599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski FooA.mu.Lock(); 44699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski FooA.a = 5; 44799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski FooA.mu.Unlock(); 44899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 44999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 45099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_1() { 45199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateBar BarA; 45299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.FooPointer->mu.Lock(); 45399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.FooPointer->a = 2; 45499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.FooPointer->mu.Unlock(); 45599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 45699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 45799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_0() { 45899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo fooA; 45999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateFoo fooB; 46099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski fooA.mu.Lock(); 46199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski fooB.a = 5; // \ 46299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski // expected-warning{{writing variable 'a' requires lock on 'mu' to be held exclusively}} 46399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski fooA.mu.Unlock(); 46499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 46599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 46699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_1() { 46799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski Mutex mu; 46899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski mu.Lock(); 46999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski b1.mu1_.Lock(); 47099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski int res = b1.a_ + b3->b_; 47199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski b3->b_ = *b1.q; // \ 47299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski // expected-warning{{reading the value pointed to by 'q' requires lock on 'mu' to be held}} 47399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski b1.mu1_.Unlock(); 47499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski b1.b_ = res; 47599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski mu.Unlock(); 47699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 47799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 47899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_2() { 47999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateBar BarA; 48099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.FooPointer->mu.Lock(); 48199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.Foo.a = 2; // \ 48299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski // expected-warning{{writing variable 'a' requires lock on 'mu' to be held exclusively}} 48399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.FooPointer->mu.Unlock(); 48499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 48599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 48699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_3() { 48799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateBar BarA; 48899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.Foo.mu.Lock(); 48999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.FooPointer->a = 2; // \ 49099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski // expected-warning{{writing variable 'a' requires lock on 'mu' to be held exclusively}} 49199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.Foo.mu.Unlock(); 49299107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 49399107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 49499107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowskivoid late_bad_4() { 49599107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski LateBar BarA; 49699107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.Foo.mu.Lock(); 49799107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.Foo2.a = 2; // \ 49899107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski // expected-warning{{writing variable 'a' requires lock on 'mu' to be held exclusively}} 49999107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski BarA.Foo.mu.Unlock(); 50099107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski} 50199107ebc0a5aea953b736e12757e0919d5249d43Caitlin Sadowski 502a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski//-----------------------------------------------// 503a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski// Extra warnings for shared vs. exclusive locks 504a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski// ----------------------------------------------// 505a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 506a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_0() { 507a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); 508a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski do { 509a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 510a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); 511a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski } while (getBool()); 512a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 513a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 514a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 515a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_1() { 516a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.ReaderLock(); 517a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski do { 518a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 519a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); // \ 5208bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{lock 'sls_mu' is exclusive and shared in the same scope}} 521a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski } while (getBool()); 522a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 523a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 524a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 525a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_3() { 526a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski if (getBool()) 527a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); 528a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski else 529a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); 530a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski *pgb_var = 1; 531a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 532a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 533a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 534a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_4() { 535a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski if (getBool()) 536a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.ReaderLock(); 537a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski else 538a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.ReaderLock(); 539a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski int x = sls_guardby_var; 540a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 541a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 542a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 543a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_fun_8() { 544a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski if (getBool()) 545a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); // \ 5468bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{lock 'sls_mu' is exclusive and shared in the same scope}} 547a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski else 548a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.ReaderLock(); // \ 5498bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-note {{the other lock of mutex 'sls_mu' is here}} 550a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 551a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 552a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 553a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_bad_0() { 554a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); 555a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski do { 556a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 557a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.ReaderLock(); // \ 5588bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{lock 'sls_mu' is exclusive and shared in the same scope}} 559a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski } while (getBool()); 560a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 561a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 562a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 563a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_bad_1() { 564a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski if (getBool()) 565a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); // \ 5668bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{lock 'sls_mu' is exclusive and shared in the same scope}} 567a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski else 568a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.ReaderLock(); // \ 5698bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-note {{the other lock of mutex 'sls_mu' is here}} 570a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski *pgb_var = 1; 571a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 572a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 573a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski 574a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowskivoid shared_bad_2() { 575a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski if (getBool()) 576a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.ReaderLock(); // \ 5778bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{lock 'sls_mu' is exclusive and shared in the same scope}} 578a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski else 579a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Lock(); // \ 5808bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-note {{the other lock of mutex 'sls_mu' is here}} 581a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski *pgb_var = 1; 582a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski sls_mu.Unlock(); 583a53257c94a4d871e64070f72edb687dcfb08c15dCaitlin Sadowski} 584978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 585978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski// FIXME: Add support for functions (not only methods) 586978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskiclass LRBar { 587978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski public: 588978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski void aa_elr_fun() __attribute__((exclusive_locks_required(aa_mu))); 589978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski void aa_elr_fun_s() __attribute__((shared_locks_required(aa_mu))); 590978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski void le_fun() __attribute__((locks_excluded(sls_mu))); 591978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}; 592978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 593978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskiclass LRFoo { 594978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski public: 595978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski void test() __attribute__((exclusive_locks_required(sls_mu))); 596978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski void testShared() __attribute__((shared_locks_required(sls_mu2))); 597978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski}; 598978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 599978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid elr_fun() __attribute__((exclusive_locks_required(sls_mu))); 600978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid elr_fun() {} 601978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 602978191e0906606e32965cebcf81627d8e8711b13Caitlin SadowskiLRFoo MyLRFoo; 603978191e0906606e32965cebcf81627d8e8711b13Caitlin SadowskiLRBar Bar; 604978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 605978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_0() { 606978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.Lock(); 607978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.aa_elr_fun(); 608978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.Unlock(); 609978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 610978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 611978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_1() { 612978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.Lock(); 613978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.aa_elr_fun_s(); 614978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.Unlock(); 615978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 616978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 617978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_2() { 618978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.ReaderLock(); 619978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.aa_elr_fun_s(); 620978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.Unlock(); 621978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 622978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 623978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_3() { 624978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Lock(); 625978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski MyLRFoo.test(); 626978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Unlock(); 627978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 628978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 629978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_4() { 630978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu2.Lock(); 631978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski MyLRFoo.testShared(); 632978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu2.Unlock(); 633978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 634978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 635978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_5() { 636978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu2.ReaderLock(); 637978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski MyLRFoo.testShared(); 638978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu2.Unlock(); 639978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 640978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 641978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_6() { 642978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.le_fun(); 643978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 644978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 645978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_fun_7() { 646978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Lock(); 647978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski elr_fun(); 648978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Unlock(); 649978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 650978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 651af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowskivoid es_fun_8() __attribute__((no_thread_safety_analysis)); 652af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski 653af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowskivoid es_fun_8() { 654af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski Bar.aa_elr_fun_s(); 655af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski} 656af37061fea31f3f1d0638edb5486e8d72c701522Caitlin Sadowski 657978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_0() { 658978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.aa_elr_fun(); // \ 6598bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{calling function 'aa_elr_fun' requires exclusive lock on 'aa_mu'}} 660978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 661978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 662978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_1() { 663978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.ReaderLock(); 664978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.aa_elr_fun(); // \ 6658bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{calling function 'aa_elr_fun' requires exclusive lock on 'aa_mu'}} 666978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski aa_mu.Unlock(); 667978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 668978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 669978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_2() { 670978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.aa_elr_fun_s(); // \ 6718bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{calling function 'aa_elr_fun_s' requires shared lock on 'aa_mu'}} 672978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 673978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 674978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_3() { 675978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski MyLRFoo.test(); // \ 6768bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{calling function 'test' requires exclusive lock on 'sls_mu'}} 677978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 678978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 679978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_4() { 680978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski MyLRFoo.testShared(); // \ 6818bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{calling function 'testShared' requires shared lock on 'sls_mu2'}} 682978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 683978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 684978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_5() { 685978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.ReaderLock(); 686978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski MyLRFoo.test(); // \ 6878bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{calling function 'test' requires exclusive lock on 'sls_mu'}} 688978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Unlock(); 689978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 690978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 691978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_6() { 692978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Lock(); 693978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.le_fun(); // \ 6948bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{cannot call function 'le_fun' while holding mutex 'sls_mu'}} 695978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Unlock(); 696978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 697978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski 698978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowskivoid es_bad_7() { 699978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.ReaderLock(); 700978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski Bar.le_fun(); // \ 7018bccabeac6b98650dfd88bd1fc84e841eb42af4bCaitlin Sadowski // expected-warning {{cannot call function 'le_fun' while holding mutex 'sls_mu'}} 702978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski sls_mu.Unlock(); 703978191e0906606e32965cebcf81627d8e8711b13Caitlin Sadowski} 704