aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrabhu Rajasekaran <prabhukr@google.com>2025-05-20 07:45:14 -0700
committerGitHub <noreply@github.com>2025-05-20 07:45:14 -0700
commit1a9377bef3d3c42edf6cc705466ededd6f7761f6 (patch)
tree5e7fda567f999af6ca33e52a670f0d0f1a39ccc5
parenta0058d18512e0ddf355bb474701e2183d84a0506 (diff)
downloadllvm-1a9377bef3d3c42edf6cc705466ededd6f7761f6.zip
llvm-1a9377bef3d3c42edf6cc705466ededd6f7761f6.tar.gz
llvm-1a9377bef3d3c42edf6cc705466ededd6f7761f6.tar.bz2
[clang][analysis] Thread Safety Analysis: Handle parenthesis (#140656)
-rw-r--r--clang/lib/Analysis/ThreadSafety.cpp2
-rw-r--r--clang/test/Analysis/thread-safety-handle-parenthesis.cpp19
2 files changed, 20 insertions, 1 deletions
diff --git a/clang/lib/Analysis/ThreadSafety.cpp b/clang/lib/Analysis/ThreadSafety.cpp
index 7e86af6..156df51a 100644
--- a/clang/lib/Analysis/ThreadSafety.cpp
+++ b/clang/lib/Analysis/ThreadSafety.cpp
@@ -1671,7 +1671,7 @@ void ThreadSafetyAnalyzer::checkAccess(const FactSet &FSet, const Expr *Exp,
// Guard against self-initialization. e.g., int &i = i;
if (E == Exp)
break;
- Exp = E;
+ Exp = E->IgnoreImplicit()->IgnoreParenCasts();
continue;
}
}
diff --git a/clang/test/Analysis/thread-safety-handle-parenthesis.cpp b/clang/test/Analysis/thread-safety-handle-parenthesis.cpp
new file mode 100644
index 0000000..ed0280b
--- /dev/null
+++ b/clang/test/Analysis/thread-safety-handle-parenthesis.cpp
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -Wthread-safety %s
+
+struct __attribute__((lockable)) Lock {};
+
+void sink_protected(int);
+
+struct Baz {
+public:
+ Lock lock_;
+ int protected_num_ __attribute__((guarded_by(lock_))) = 1;
+};
+
+void paren_test() {
+ Baz baz;
+ int& n = baz.protected_num_;
+ sink_protected(n); // expected-warning{{reading variable 'protected_num_' requires holding mutex 'baz.lock_'}}
+ int& n2 = (baz.protected_num_);
+ sink_protected(n2); // expected-warning{{reading variable 'protected_num_' requires holding mutex 'baz.lock_'}}
+}