https://github.com/JasonHonKL updated https://github.com/llvm/llvm-project/pull/204338
>From 7cad72cb8dc8e9b72d9410ebec4a21af9642102a Mon Sep 17 00:00:00 2001 From: JasonHonKL <[email protected]> Date: Wed, 17 Jun 2026 19:20:27 +0800 Subject: [PATCH 1/3] add RAIIMemberMutexDescriptor to handle unique_lock unlock issue. --- .../BlockInCriticalSectionChecker.cpp | 54 +++++++++++++++++-- test_block_in_cs.plist | 14 +++++ 2 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 test_block_in_cs.plist diff --git a/clang/lib/StaticAnalyzer/Checkers/BlockInCriticalSectionChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/BlockInCriticalSectionChecker.cpp index 03c576270797b..256edf07d4482 100644 --- a/clang/lib/StaticAnalyzer/Checkers/BlockInCriticalSectionChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/BlockInCriticalSectionChecker.cpp @@ -157,9 +157,55 @@ class RAIIMutexDescriptor { } }; +class RAIIMemberMutexDescriptor { + mutable const IdentifierInfo *WrapperType{}; + mutable bool IdentifierInitialized{}; + mutable llvm::SmallString<32> WrapperTypeName{}; + + void initIdentifierInfo(const CallEvent &Call) const { + if (!IdentifierInitialized) { + const auto &ASTCtx = Call.getASTContext(); + WrapperType = &ASTCtx.Idents.get(WrapperTypeName); + IdentifierInitialized = true; + } + } + +public: + RAIIMemberMutexDescriptor(StringRef WrapperTypeName) + : WrapperTypeName(WrapperTypeName) {} + + [[nodiscard]] bool matches(const CallEvent &Call, bool IsLock) const { + initIdentifierInfo(Call); + + const auto *MemCall = dyn_cast<CXXMemberCall>(&Call); + if (!MemCall) + return false; + + const CXXMethodDecl *Method = MemCall->getDecl(); + const CXXRecordDecl *ClassDecl = Method->getParent(); + const IdentifierInfo *ClassName = ClassDecl->getIdentifier(); + + if (ClassName != WrapperType) + return false; + + const IdentifierInfo *MethodName = Method->getIdentifier(); + if (!MethodName) + return false; + + if (IsLock) + return MethodName->isStr("lock"); + else + return MethodName->isStr("unlock"); + } + + [[nodiscard]] const MemRegion *getRegion(const CallEvent &Call, bool) const { + return cast<CXXMemberCall>(Call).getCXXThisVal().getAsRegion(); + } +}; + using MutexDescriptor = std::variant<FirstArgMutexDescriptor, MemberMutexDescriptor, - RAIIMutexDescriptor>; + RAIIMutexDescriptor, RAIIMemberMutexDescriptor>; class SuppressNonBlockingStreams : public BugReporterVisitor { private: @@ -214,7 +260,7 @@ class SuppressNonBlockingStreams : public BugReporterVisitor { class BlockInCriticalSectionChecker : public Checker<check::PostCall> { private: - const std::array<MutexDescriptor, 9> MutexDescriptors{ + const std::array<MutexDescriptor, 11> MutexDescriptors{ // NOTE: There are standard library implementations where some methods // of `std::mutex` are inherited from an implementation detail base // class, and those aren't matched by the name specification {"std", @@ -239,7 +285,9 @@ class BlockInCriticalSectionChecker : public Checker<check::PostCall> { {CDM::CLibrary, {"mtx_unlock"}, 1}), RAIIMutexDescriptor("lock_guard"), RAIIMutexDescriptor("unique_lock"), - RAIIMutexDescriptor("scoped_lock")}; + RAIIMemberMutexDescriptor("unique_lock"), + RAIIMutexDescriptor("scoped_lock"), + RAIIMemberMutexDescriptor("scoped_lock")}; const CallDescriptionSet BlockingFunctions{{CDM::CLibrary, {"sleep"}}, {CDM::CLibrary, {"getc"}}, diff --git a/test_block_in_cs.plist b/test_block_in_cs.plist new file mode 100644 index 0000000000000..04ff38cef2842 --- /dev/null +++ b/test_block_in_cs.plist @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>clang_version</key> +<string>Homebrew clang version 22.1.7</string> + <key>diagnostics</key> + <array> + </array> + <key>files</key> + <array> + </array> +</dict> +</plist> >From b0133818745292aee2c27cbbb4faea6047463ab5 Mon Sep 17 00:00:00 2001 From: JasonHonKL <[email protected]> Date: Wed, 17 Jun 2026 19:23:21 +0800 Subject: [PATCH 2/3] Improve type safety in RAIIMemberMutexDescriptor by using explicit cast --- .../StaticAnalyzer/Checkers/BlockInCriticalSectionChecker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/BlockInCriticalSectionChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/BlockInCriticalSectionChecker.cpp index 256edf07d4482..3d0b27af79763 100644 --- a/clang/lib/StaticAnalyzer/Checkers/BlockInCriticalSectionChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/BlockInCriticalSectionChecker.cpp @@ -181,7 +181,7 @@ class RAIIMemberMutexDescriptor { if (!MemCall) return false; - const CXXMethodDecl *Method = MemCall->getDecl(); + const CXXMethodDecl *Method = cast<CXXMethodDecl>(MemCall->getDecl()); const CXXRecordDecl *ClassDecl = Method->getParent(); const IdentifierInfo *ClassName = ClassDecl->getIdentifier(); >From fbec6f1fe2e8bf9f8b3b36fa3e4cd4f25a8d3057 Mon Sep 17 00:00:00 2001 From: JasonHonKL <[email protected]> Date: Wed, 17 Jun 2026 19:28:00 +0800 Subject: [PATCH 3/3] Remove accidentally committed test plist file The test_block_in_cs.plist file was accidentally added during development. It's empty and not in the proper location for test fixtures. --- test_block_in_cs.plist | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 test_block_in_cs.plist diff --git a/test_block_in_cs.plist b/test_block_in_cs.plist deleted file mode 100644 index 04ff38cef2842..0000000000000 --- a/test_block_in_cs.plist +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>clang_version</key> -<string>Homebrew clang version 22.1.7</string> - <key>diagnostics</key> - <array> - </array> - <key>files</key> - <array> - </array> -</dict> -</plist> _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
