]> granicus.if.org Git - clang/commitdiff
Thread Safety Analysis: fix before/after checks so that they work on global
authorDeLesley Hutchins <delesley@google.com>
Tue, 29 Sep 2015 15:25:51 +0000 (15:25 +0000)
committerDeLesley Hutchins <delesley@google.com>
Tue, 29 Sep 2015 15:25:51 +0000 (15:25 +0000)
variables as well member variables.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@248803 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/Analyses/ThreadSafetyCommon.h
lib/Analysis/ThreadSafetyCommon.cpp
test/Sema/warn-thread-safety-analysis.c
test/SemaCXX/warn-thread-safety-analysis.cpp

index 9b7725ab0f3ccb80abdc35026213e239d68512ca..d9efe1980cfe44c24cf7b772146dbd9a5da98c62 100644 (file)
@@ -291,6 +291,8 @@ public:
       return nullptr;
     if (auto *P = dyn_cast<til::Project>(CapExpr))
       return P->clangDecl();
+    if (auto *P = dyn_cast<til::LiteralPtr>(CapExpr))
+      return P->clangDecl();
     return nullptr;
   }
 
index 3c4d6b30159f3b986966b4a63608110f46db180b..fa82378da18a2c9e3cf1eed706c20e3111dbd04d 100644 (file)
@@ -290,7 +290,7 @@ til::SExpr *SExprBuilder::translateDeclRefExpr(const DeclRefExpr *DRE,
     VD = FD->getParamDecl(I);
   }
 
-  // For non-local variables, treat it as a referenced to a named object.
+  // For non-local variables, treat it as a reference to a named object.
   return new (Arena) til::LiteralPtr(VD);
 }
 
index 55e6e707f013092ca4ac46fa30055e6980dad1b9..a0c4026b913626a59db5e4dc9b2dc39076c735cf 100644 (file)
@@ -81,7 +81,8 @@ int main() {
   mutex_shared_lock(&mu2);
   Foo_fun1(1);
 
-  mutex_shared_lock(&mu1); // expected-warning{{acquiring mutex 'mu1' that is already held}}
+  mutex_shared_lock(&mu1); // expected-warning{{acquiring mutex 'mu1' that is already held}} \
+                              expected-warning{{mutex 'mu1' must be acquired before 'mu2'}}
   mutex_unlock(&mu1);
   mutex_unlock(&mu2);
   mutex_shared_lock(&mu1);
index cdbef700a181922fdb750efa25fd403957770bcd..6daefd78d3df72894bb11affeb23194f17c5aeb2 100644 (file)
@@ -5145,4 +5145,17 @@ void test() {
 }  // end namespace TestReferenceNoThreadSafetyAnalysis
 
 
+namespace GlobalAcquiredBeforeAfterTest {
+
+Mutex mu1;
+Mutex mu2 ACQUIRED_AFTER(mu1);
+
+void test3() {
+  mu2.Lock();
+  mu1.Lock();  // expected-warning {{mutex 'mu1' must be acquired before 'mu2'}}
+  mu1.Unlock();
+  mu2.Unlock();
+}
+
+}  // end namespace  GlobalAcquiredBeforeAfterTest