Author: Aaron Puchert Date: 2020-10-30T00:35:14+01:00 New Revision: bbed8cfe80cd27d3a47d877c7608d9be4e487d97
URL: https://github.com/llvm/llvm-project/commit/bbed8cfe80cd27d3a47d877c7608d9be4e487d97 DIFF: https://github.com/llvm/llvm-project/commit/bbed8cfe80cd27d3a47d877c7608d9be4e487d97.diff LOG: Thread safety analysis: Consider static class members as inaccessible This fixes the issue pointed out in D84604#2363134. For now we exclude static members completely, we'll take them into account later. Added: Modified: clang/lib/Analysis/ThreadSafety.cpp clang/test/SemaCXX/warn-thread-safety-negative.cpp Removed: ################################################################################ diff --git a/clang/lib/Analysis/ThreadSafety.cpp b/clang/lib/Analysis/ThreadSafety.cpp index 65d410a65ba4..21583e92c72d 100644 --- a/clang/lib/Analysis/ThreadSafety.cpp +++ b/clang/lib/Analysis/ThreadSafety.cpp @@ -1269,10 +1269,16 @@ bool ThreadSafetyAnalyzer::inCurrentScope(const CapabilityExpr &CapE) { const threadSafety::til::SExpr *SExp = CapE.sexpr(); assert(SExp && "Null expressions should be ignored"); - // Global variables are always in scope. if (const auto *LP = dyn_cast<til::LiteralPtr>(SExp)) { const ValueDecl *VD = LP->clangDecl(); - return VD->isDefinedOutsideFunctionOrMethod(); + // Variables defined in a function are always inaccessible. + if (!VD->isDefinedOutsideFunctionOrMethod()) + return false; + // For now we consider static class members to be inaccessible. + if (isa<CXXRecordDecl>(VD->getDeclContext())) + return false; + // Global variables are always in scope. + return true; } // Members are in scope from methods of the same class. diff --git a/clang/test/SemaCXX/warn-thread-safety-negative.cpp b/clang/test/SemaCXX/warn-thread-safety-negative.cpp index d7db5f402d11..9eabd67e4fc7 100644 --- a/clang/test/SemaCXX/warn-thread-safety-negative.cpp +++ b/clang/test/SemaCXX/warn-thread-safety-negative.cpp @@ -118,6 +118,33 @@ void testNamespaceGlobals() EXCLUSIVE_LOCKS_REQUIRED(!globalMutex) { ns::fq(); // expected-warning {{calling function 'fq' requires negative capability '!globalMutex'}} } +class StaticMembers { +public: + void pub() EXCLUSIVE_LOCKS_REQUIRED(!publicMutex); + void prot() EXCLUSIVE_LOCKS_REQUIRED(!protectedMutex); + void priv() EXCLUSIVE_LOCKS_REQUIRED(!privateMutex); + void test() { + pub(); + prot(); + priv(); + } + + static Mutex publicMutex; + +protected: + static Mutex protectedMutex; + +private: + static Mutex privateMutex; +}; + +void testStaticMembers() { + StaticMembers x; + x.pub(); + x.prot(); + x.priv(); +} + } // end namespace ScopeTest namespace DoubleAttribute { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits