]> granicus.if.org Git - clang/commitdiff
Thread-safety analysis: fix bug in expression matching code.
authorDeLesley Hutchins <delesley@google.com>
Tue, 11 Sep 2012 23:04:49 +0000 (23:04 +0000)
committerDeLesley Hutchins <delesley@google.com>
Tue, 11 Sep 2012 23:04:49 +0000 (23:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163656 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/ThreadSafety.cpp
test/SemaCXX/warn-thread-safety-analysis.cpp

index 88759434805aca69576d6212cc0857aa01f4110f..196d5e1eb361bda29ae039d5d67c891cbd377017 100644 (file)
@@ -454,7 +454,6 @@ private:
   void buildSExprFromExpr(Expr *MutexExp, Expr *DeclExp, const NamedDecl *D) {
     CallingContext CallCtx(D);
 
-
     if (MutexExp) {
       if (StringLiteral* SLit = dyn_cast<StringLiteral>(MutexExp)) {
         if (SLit->getString() == StringRef("*"))
@@ -562,7 +561,9 @@ public:
 
   bool matches(const SExpr &Other, unsigned i = 0, unsigned j = 0) const {
     if (NodeVec[i].matches(Other.NodeVec[j])) {
-      unsigned n = NodeVec[i].arity();
+      unsigned ni = NodeVec[i].arity();
+      unsigned nj = Other.NodeVec[j].arity();
+      unsigned n = (ni < nj) ? ni : nj;
       bool Result = true;
       unsigned ci = i+1;  // first child of i
       unsigned cj = j+1;  // first child of j
index 463dd7d05ba01376c7d3156e209bc41ceac36ebf..430df574f36b9ddd5f20de58bb2804354b1b8951 100644 (file)
@@ -3341,3 +3341,43 @@ public:
 }  // end namespace TemplateLockReturned
 
 
+namespace ExprMatchingBugFix {
+
+class Foo {
+public:
+  Mutex mu_;
+};
+
+
+class Bar {
+public:
+  bool c;
+  Foo* foo;
+  Bar(Foo* f) : foo(f) { }
+
+  struct Nested {
+    Foo* foo;
+    Nested(Foo* f) : foo(f) { }
+
+    void unlockFoo() UNLOCK_FUNCTION(&Foo::mu_);
+  };
+
+  void test();
+};
+
+
+void Bar::test() {
+  foo->mu_.Lock();
+  if (c) {
+    Nested *n = new Nested(foo);
+    n->unlockFoo();
+  }
+  else {
+    foo->mu_.Unlock();
+  }
+}
+
+}; // end namespace ExprMatchingBugfix
+
+
+