r194157 - Thread safety analysis: minor bugfix to smart pointer handling, and expanded

DeLesley Hutchins delesley at google.com
Wed Nov 6 10:40:01 PST 2013


Author: delesley
Date: Wed Nov  6 12:40:01 2013
New Revision: 194157

URL: http://llvm.org/viewvc/llvm-project?rev=194157&view=rev
Log:
Thread safety analysis: minor bugfix to smart pointer handling, and expanded
test case.

Modified:
    cfe/trunk/lib/Analysis/ThreadSafety.cpp
    cfe/trunk/test/SemaCXX/warn-thread-safety-analysis.cpp

Modified: cfe/trunk/lib/Analysis/ThreadSafety.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/ThreadSafety.cpp?rev=194157&r1=194156&r2=194157&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/ThreadSafety.cpp (original)
+++ cfe/trunk/lib/Analysis/ThreadSafety.cpp Wed Nov  6 12:40:01 2013
@@ -2137,14 +2137,15 @@ void BuildLockset::VisitCallExpr(CallExp
       case OO_Star:
       case OO_Arrow: {
         if (Analyzer->Handler.issueBetaWarnings()) {
-          const Expr *Target = OE->getArg(0);
-          checkPtAccess(Target, AK_Read);
+          const Expr *Obj = OE->getArg(0);
+          checkAccess(Obj, AK_Read);
+          checkPtAccess(Obj, AK_Read);
         }
         break;
       }
       default: {
-        const Expr *Source = OE->getArg(0);
-        checkAccess(Source, AK_Read);
+        const Expr *Obj = OE->getArg(0);
+        checkAccess(Obj, AK_Read);
         break;
       }
     }

Modified: cfe/trunk/test/SemaCXX/warn-thread-safety-analysis.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-thread-safety-analysis.cpp?rev=194157&r1=194156&r2=194157&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/warn-thread-safety-analysis.cpp (original)
+++ cfe/trunk/test/SemaCXX/warn-thread-safety-analysis.cpp Wed Nov  6 12:40:01 2013
@@ -4213,14 +4213,44 @@ class PtGuardedBySanityTest {
 
 
 class SmartPtr_PtGuardedBy_Test {
+  Mutex mu1;
   Mutex mu2;
-  SmartPtr<int>  sp PT_GUARDED_BY(mu2);
-  SmartPtr<Cell> sq PT_GUARDED_BY(mu2);
+  SmartPtr<int>  sp GUARDED_BY(mu1) PT_GUARDED_BY(mu2);
+  SmartPtr<Cell> sq GUARDED_BY(mu1) PT_GUARDED_BY(mu2);
 
-  void test() {
-    sp.get();   // OK -- no GUARDED_BY
-    *sp = 0;    // expected-warning {{reading the value pointed to by 'sp' requires locking 'mu2'}}
-    sq->a = 0;  // expected-warning {{reading the value pointed to by 'sq' requires locking 'mu2'}}
+  void test1() {
+    mu1.ReaderLock();
+    mu2.Lock();
+
+    sp.get();
+    if (*sp == 0) doSomething();
+    *sp = 0;
+    sq->a = 0;
+
+    mu2.Unlock();
+    mu1.Unlock();
+  }
+
+  void test2() {
+    mu2.Lock();
+
+    sp.get();                     // expected-warning {{reading variable 'sp' requires locking 'mu1'}}
+    if (*sp == 0) doSomething();  // expected-warning {{reading variable 'sp' requires locking 'mu1'}}
+    *sp = 0;                      // expected-warning {{reading variable 'sp' requires locking 'mu1'}}
+    sq->a = 0;                    // expected-warning {{reading variable 'sq' requires locking 'mu1'}}
+
+    mu2.Unlock();
+  }
+
+  void test3() {
+    mu1.Lock();
+
+    sp.get();
+    if (*sp == 0) doSomething();  // expected-warning {{reading the value pointed to by 'sp' requires locking 'mu2'}}
+    *sp = 0;                      // expected-warning {{reading the value pointed to by 'sp' requires locking 'mu2'}}
+    sq->a = 0;                    // expected-warning {{reading the value pointed to by 'sq' requires locking 'mu2'}}
+
+    mu1.Unlock();
   }
 };
 





More information about the cfe-commits mailing list