[clang] [alpha.webkit.webkit.RetainPtrCtorAdoptChecker] Add a new WebKit checker for correct use of RetainPtr, adoptNS, and adoptCF (PR #128679)

via cfe-commits cfe-commits at lists.llvm.org
Tue Feb 25 01:04:09 PST 2025


github-actions[bot] wrote:

<!--LLVM CODE FORMAT COMMENT: {clang-format}-->


:warning: C/C++ code formatter, clang-format found issues in your code. :warning:

<details>
<summary>
You can test this locally with the following command:
</summary>

``````````bash
git-clang-format --diff b335d5a8303250cb49901ecae7570adf61abbd3c b4001f95cf6d35f59ef8af6df8f2bdbe043da380 --extensions cpp,h -- clang/lib/StaticAnalyzer/Checkers/WebKit/RetainPtrCtorAdoptChecker.cpp clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.h clang/test/Analysis/Checkers/WebKit/objc-mock-types.h
``````````

</details>

<details>
<summary>
View the diff from clang-format here.
</summary>

``````````diff
diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/RetainPtrCtorAdoptChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/RetainPtrCtorAdoptChecker.cpp
index 8727f89826..1f4fc0dd4b 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/RetainPtrCtorAdoptChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/RetainPtrCtorAdoptChecker.cpp
@@ -12,12 +12,12 @@
 #include "clang/AST/CXXInheritance.h"
 #include "clang/AST/RecursiveASTVisitor.h"
 #include "clang/AST/StmtVisitor.h"
+#include "clang/Analysis/RetainSummaryManager.h"
 #include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h"
 #include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
 #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
 #include "clang/StaticAnalyzer/Core/Checker.h"
 #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
-#include "clang/Analysis/RetainSummaryManager.h"
 #include "llvm/ADT/DenseSet.h"
 #include "llvm/ADT/SetVector.h"
 #include <optional>
@@ -37,8 +37,7 @@ private:
 
 public:
   RetainPtrCtorAdoptChecker()
-      : Bug(this,
-            "Correct use of RetainPtr, adoptNS, and adoptCF",
+      : Bug(this, "Correct use of RetainPtr, adoptNS, and adoptCF",
             "WebKit coding guidelines") {}
 
   void checkASTDecl(const TranslationUnitDecl *TUD, AnalysisManager &MGR,
@@ -68,7 +67,7 @@ public:
           DeclWithIssue = D;
         return Base::TraverseDecl(D);
       }
-      
+
       bool TraverseClassTemplateDecl(ClassTemplateDecl *CTD) {
         if (safeGetName(CTD) == "RetainPtr")
           return true; // Skip the contents of RetainPtr.
@@ -95,8 +94,9 @@ public:
     };
 
     LocalVisitor visitor(this);
-    Summaries = std::make_unique<RetainSummaryManager>(TUD->getASTContext(),
-        true /* trackObjCAndCFObjects */, false /* trackOSObjects */);
+    Summaries = std::make_unique<RetainSummaryManager>(
+        TUD->getASTContext(), true /* trackObjCAndCFObjects */,
+        false /* trackOSObjects */);
     RTC.visitTranslationUnitDecl(TUD);
     visitor.TraverseDecl(const_cast<TranslationUnitDecl *>(TUD));
   }
@@ -112,7 +112,7 @@ public:
     return Name == "adoptNS" || Name == "adoptNSArc";
   }
 
-  void visitCallExpr(const CallExpr *CE, const Decl* DeclWithIssue) const {
+  void visitCallExpr(const CallExpr *CE, const Decl *DeclWithIssue) const {
     if (BR->getSourceManager().isInSystemHeader(CE->getExprLoc()))
       return;
 
@@ -138,7 +138,7 @@ public:
   }
 
   void visitConstructExpr(const CXXConstructExpr *CE,
-                          const Decl* DeclWithIssue) const {
+                          const Decl *DeclWithIssue) const {
     if (BR->getSourceManager().isInSystemHeader(CE->getExprLoc()))
       return;
 
@@ -215,20 +215,20 @@ public:
         auto Summary = Summaries->getSummary(AnyCall(ObjCMsgExpr));
         auto RetEffect = Summary->getRetEffect();
         switch (RetEffect.getKind()) {
-          case RetEffect::NoRet:
-            return IsOwnedResult::Unknown;
-          case RetEffect::OwnedSymbol:
-            return IsOwnedResult::Owned;
-          case RetEffect::NotOwnedSymbol:
-            return IsOwnedResult::NotOwned;
-          case RetEffect::OwnedWhenTrackedReceiver:
-            if (auto *Receiver = ObjCMsgExpr->getInstanceReceiver()) {
-              E = Receiver->IgnoreParenCasts();
-              continue;
-            }
-            return IsOwnedResult::Unknown;
-          case RetEffect::NoRetHard:
-            return IsOwnedResult::Unknown;
+        case RetEffect::NoRet:
+          return IsOwnedResult::Unknown;
+        case RetEffect::OwnedSymbol:
+          return IsOwnedResult::Owned;
+        case RetEffect::NotOwnedSymbol:
+          return IsOwnedResult::NotOwned;
+        case RetEffect::OwnedWhenTrackedReceiver:
+          if (auto *Receiver = ObjCMsgExpr->getInstanceReceiver()) {
+            E = Receiver->IgnoreParenCasts();
+            continue;
+          }
+          return IsOwnedResult::Unknown;
+        case RetEffect::NoRetHard:
+          return IsOwnedResult::Unknown;
         }
       }
       if (auto *CXXCE = dyn_cast<CXXMemberCallExpr>(E)) {
@@ -262,16 +262,16 @@ public:
         auto Summary = Summaries->getSummary(AnyCall(CE));
         auto RetEffect = Summary->getRetEffect();
         switch (RetEffect.getKind()) {
-          case RetEffect::NoRet:
-            return IsOwnedResult::Unknown;
-          case RetEffect::OwnedSymbol:
-            return IsOwnedResult::Owned;
-          case RetEffect::NotOwnedSymbol:
-            return IsOwnedResult::NotOwned;
-          case RetEffect::OwnedWhenTrackedReceiver:
-            return IsOwnedResult::Unknown;
-          case RetEffect::NoRetHard:
-            return IsOwnedResult::Unknown;
+        case RetEffect::NoRet:
+          return IsOwnedResult::Unknown;
+        case RetEffect::OwnedSymbol:
+          return IsOwnedResult::Owned;
+        case RetEffect::NotOwnedSymbol:
+          return IsOwnedResult::NotOwned;
+        case RetEffect::OwnedWhenTrackedReceiver:
+          return IsOwnedResult::Unknown;
+        case RetEffect::NoRetHard:
+          return IsOwnedResult::Unknown;
         }
       }
       break;
@@ -280,8 +280,8 @@ public:
   }
 
   template <typename ExprType>
-  void reportUnknown(std::string& Name, const ExprType *CE,
-                     const Decl* DeclWithIssue) const {
+  void reportUnknown(std::string &Name, const ExprType *CE,
+                     const Decl *DeclWithIssue) const {
     SmallString<100> Buf;
     llvm::raw_svector_ostream Os(Buf);
 
@@ -295,14 +295,14 @@ public:
     BR->emitReport(std::move(Report));
   }
 
-  void reportUseAfterFree(std::string& Name, const CallExpr *CE,
-                          const Decl* DeclWithIssue,
-                          const char* condition = nullptr) const {
+  void reportUseAfterFree(std::string &Name, const CallExpr *CE,
+                          const Decl *DeclWithIssue,
+                          const char *condition = nullptr) const {
     SmallString<100> Buf;
     llvm::raw_svector_ostream Os(Buf);
 
-    Os << "Incorrect use of " << Name <<
-      ". The argument is +0 and results in an use-after-free";
+    Os << "Incorrect use of " << Name
+       << ". The argument is +0 and results in an use-after-free";
     if (condition)
       Os << " " << condition;
     Os << ".";
@@ -315,14 +315,14 @@ public:
     BR->emitReport(std::move(Report));
   }
 
-  void reportLeak(std::string& Name, const CXXConstructExpr *CE,
-                  const Decl* DeclWithIssue,
-                  const char* condition = nullptr) const {
+  void reportLeak(std::string &Name, const CXXConstructExpr *CE,
+                  const Decl *DeclWithIssue,
+                  const char *condition = nullptr) const {
     SmallString<100> Buf;
     llvm::raw_svector_ostream Os(Buf);
 
-    Os << "Incorrect use of " << Name <<
-      ". The argument is +1 and results in a memory leak";
+    Os << "Incorrect use of " << Name
+       << ". The argument is +1 and results in a memory leak";
     if (condition)
       Os << " " << condition;
     Os << ".";
@@ -341,7 +341,6 @@ void ento::registerRetainPtrCtorAdoptChecker(CheckerManager &Mgr) {
   Mgr.registerChecker<RetainPtrCtorAdoptChecker>();
 }
 
-bool ento::shouldRegisterRetainPtrCtorAdoptChecker(
-    const CheckerManager &mgr) {
+bool ento::shouldRegisterRetainPtrCtorAdoptChecker(const CheckerManager &mgr) {
   return true;
 }

``````````

</details>


https://github.com/llvm/llvm-project/pull/128679


More information about the cfe-commits mailing list