Attached is a patch which skips analysis inside of lock functions
(avoiding spurious warnings).

Cheers,

Caitlin
From c0aba1cbc2f62113c430abf49c79a99d089c88ac Mon Sep 17 00:00:00 2001
From: Caitlin Sadowski <[email protected]>
Date: Mon, 12 Sep 2011 16:05:34 -0700
Subject: [PATCH] Thread safety: skip analysis inside of lock functions

---
 lib/Analysis/ThreadSafety.cpp                |    9 +++++++--
 test/SemaCXX/warn-thread-safety-analysis.cpp |    8 ++++++++
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/lib/Analysis/ThreadSafety.cpp b/lib/Analysis/ThreadSafety.cpp
index e4c144d..9954b4f 100644
--- a/lib/Analysis/ThreadSafety.cpp
+++ b/lib/Analysis/ThreadSafety.cpp
@@ -709,8 +709,13 @@ void runThreadSafetyAnalysis(AnalysisContext &AC,
                              ThreadSafetyHandler &Handler) {
   CFG *CFGraph = AC.getCFG();
   if (!CFGraph) return;
-  const Decl *D = AC.getDecl();
-  if (D && D->getAttr<NoThreadSafetyAnalysisAttr>()) return;
+  if (const Decl *D = AC.getDecl()) {
+    if (D->getAttr<NoThreadSafetyAnalysisAttr>() ||
+        D->getAttr<ExclusiveLockFunctionAttr>() ||
+        D->getAttr<SharedLockFunctionAttr>() ||
+        D->getAttr<UnlockFunctionAttr>())
+      return;
+  }
 
   Lockset::Factory LocksetFactory;
 
diff --git a/test/SemaCXX/warn-thread-safety-analysis.cpp b/test/SemaCXX/warn-thread-safety-analysis.cpp
index fc9d145..5788a43 100644
--- a/test/SemaCXX/warn-thread-safety-analysis.cpp
+++ b/test/SemaCXX/warn-thread-safety-analysis.cpp
@@ -231,6 +231,14 @@ public:
   void globalUnlock() __attribute__((unlock_function(aa_mu)));
 };
 
+void GlobalLocker::globalLock() {
+  aa_mu.Lock(); // no error
+}
+
+void GlobalLocker::globalUnlock() {
+  aa_mu.Unlock(); // no error
+}
+
 GlobalLocker glock;
 
 void aa_fun_1() {
-- 
1.7.3.1

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to