llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-static-analyzer-1

Author: Ryosuke Niwa (rniwa)

<details>
<summary>Changes</summary>

This PR improves UncountedCallArgsChecker and its variant's warning message to 
explicitly state the argument expression, the qualified callee type as well as 
the type which needs to be kept alive.

---

Patch is 88.34 KiB, truncated to 20.00 KiB below, full version: 
https://github.com/llvm/llvm-project/pull/202724.diff


24 Files Affected:

- (modified) clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp (+14) 
- (modified) clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.h (+3) 
- (modified) clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp 
(+20-1) 
- (modified) clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.h 
(+2-1) 
- (modified) 
clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefCallArgsChecker.cpp (+111-26) 
- (modified) 
clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp (+5-18) 
- (modified) clang/test/Analysis/Checkers/WebKit/binding-to-refptr.cpp (+2-2) 
- (modified) 
clang/test/Analysis/Checkers/WebKit/call-args-checked-const-member.cpp (+4-4) 
- (modified) clang/test/Analysis/Checkers/WebKit/call-args-checked-ptr.cpp 
(+21-21) 
- (modified) clang/test/Analysis/Checkers/WebKit/call-args-checked.cpp (+4-4) 
- (modified) 
clang/test/Analysis/Checkers/WebKit/call-args-counted-const-member.cpp (+5-5) 
- (modified) 
clang/test/Analysis/Checkers/WebKit/call-args-loop-init-opaque-value.cpp (+1-1) 
- (modified) clang/test/Analysis/Checkers/WebKit/call-args-safe-functions.cpp 
(+1-1) 
- (modified) clang/test/Analysis/Checkers/WebKit/call-args-wtf-containers.cpp 
(+8-8) 
- (modified) clang/test/Analysis/Checkers/WebKit/call-args.cpp (+34-34) 
- (modified) 
clang/test/Analysis/Checkers/WebKit/ref-countable-default-arg-nullptr.cpp 
(+2-2) 
- (modified) clang/test/Analysis/Checkers/WebKit/unchecked-call-arg.cpp (+1-1) 
- (modified) clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp (+43-42) 
- (modified) clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.mm (+1-1) 
- (modified) 
clang/test/Analysis/Checkers/WebKit/uncounted-obj-const-v-muable.cpp (+2-2) 
- (modified) clang/test/Analysis/Checkers/WebKit/unretained-call-args-arc.mm 
(+3-3) 
- (modified) clang/test/Analysis/Checkers/WebKit/unretained-call-args-member.mm 
(+8-8) 
- (modified) clang/test/Analysis/Checkers/WebKit/unretained-call-args.mm 
(+48-48) 
- (modified) clang/test/Analysis/Checkers/WebKit/unretained-obj-arg.mm (+2-2) 


``````````diff
diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp
index 0094c06476d77..5fd2ff87bce8d 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp
@@ -388,6 +388,20 @@ bool isAllocInit(const Expr *E, const Expr **InnerExpr) {
   return false;
 }
 
+ObjCInterfaceDecl *getObjCDeclFromObjCPtr(const Type *TypePtr) {
+  auto *PointeeType = TypePtr->getPointeeType().getTypePtrOrNull();
+  if (!PointeeType)
+    return nullptr;
+  auto *Desugared = PointeeType->getUnqualifiedDesugaredType();
+  if (!Desugared)
+    return nullptr;
+  if (auto *ObjCType = dyn_cast<ObjCInterfaceType>(Desugared))
+    return ObjCType->getDecl();
+  if (auto *ObjCType = dyn_cast<ObjCObjectType>(Desugared))
+    return ObjCType->getInterface();
+  return nullptr;
+}
+
 class EnsureFunctionVisitor
     : public ConstStmtVisitor<EnsureFunctionVisitor, bool> {
 public:
diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.h 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.h
index d0a3e471365e2..fc2c43f33037e 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.h
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.h
@@ -81,6 +81,9 @@ bool isExprToGetCheckedPtrCapableMember(const clang::Expr *E);
 /// Sets \p InnerExpr to the inner function call or selector invocation.
 bool isAllocInit(const Expr *E, const Expr **InnerExpr = nullptr);
 
+/// \returns ObjCInterfaceDecl from a pointer type.
+ObjCInterfaceDecl *getObjCDeclFromObjCPtr(const Type *TypePtr);
+
 /// \returns true if E is a CXXMemberCallExpr which returns a const smart
 /// pointer type.
 class EnsureFunctionAnalysis {
diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp
index cf165796c9695..23afbd43343d6 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp
@@ -284,7 +284,7 @@ void RetainTypeChecker::visitTypedef(const TypedefDecl *TD) 
{
   for (auto *Redecl : RT->getDecl()->getMostRecentDecl()->redecls()) {
     if (Redecl->getAttr<ObjCBridgeAttr>() ||
         Redecl->getAttr<ObjCBridgeMutableAttr>()) {
-      CFPointees.insert(RT);
+      CFPointees.insert(std::make_pair(RT, TD));
       return;
     }
   }
@@ -299,6 +299,25 @@ bool RetainTypeChecker::isUnretained(const QualType QT, 
bool ignoreARC) {
   return RecordlessTypes.contains(QT.getTypePtr());
 }
 
+const TypedefDecl* RetainTypeChecker::getCanonicalDecl(QualType QT) {
+  if (auto *TT = dyn_cast_or_null<TypedefType>(QT.getTypePtrOrNull())) {
+    if (auto *TD = dyn_cast<TypedefDecl>(TT->getDecl()))
+      return TD;
+  }
+  QT = QT.getCanonicalType();
+  auto PointeeQT = QT.getCanonicalType()->getPointeeType();
+  auto *PointeeType = PointeeQT.getTypePtrOrNull();
+  if (!PointeeType)
+    return nullptr;
+  auto *RD = dyn_cast<RecordType>(PointeeType);
+  if (!RD)
+    return nullptr;
+  auto It = CFPointees.find(RD);
+  if (It == CFPointees.end())
+    return nullptr;
+  return It->second;
+}
+
 std::optional<bool> isUncounted(const CXXRecordDecl* Class)
 {
   // Keep isRefCounted first as it's cheaper.
diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.h 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.h
index a2fd12656d391..3606ec5df0180 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.h
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.h
@@ -80,7 +80,7 @@ std::optional<bool> isUnchecked(const clang::QualType T);
 /// An inter-procedural analysis facility that detects CF types with the
 /// underlying pointer type.
 class RetainTypeChecker {
-  llvm::DenseSet<const RecordType *> CFPointees;
+  llvm::DenseMap<const RecordType *, const TypedefDecl *> CFPointees;
   llvm::DenseSet<const Type *> RecordlessTypes;
   bool IsARCEnabled{false};
   bool DefaultSynthProperties{true};
@@ -91,6 +91,7 @@ class RetainTypeChecker {
   bool isUnretained(const QualType, bool ignoreARC = false);
   bool isARCEnabled() const { return IsARCEnabled; }
   bool defaultSynthProperties() const { return DefaultSynthProperties; }
+  const TypedefDecl* getCanonicalDecl(QualType);
 };
 
 /// \returns true if \p Class is ref-countable AND not ref-counted, false if
diff --git 
a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefCallArgsChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefCallArgsChecker.cpp
index 7fee003f6f4d0..6eceffe9e9761 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefCallArgsChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefCallArgsChecker.cpp
@@ -14,6 +14,7 @@
 #include "clang/AST/DynamicRecursiveASTVisitor.h"
 #include "clang/Analysis/DomainSpecific/CocoaConventions.h"
 #include "clang/Basic/SourceLocation.h"
+#include "clang/Lex/Lexer.h"
 #include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h"
 #include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
 #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
@@ -47,7 +48,7 @@ class RawPtrRefCallArgsChecker
   virtual bool isSafePtrType(const QualType type) const = 0;
   virtual bool isSafeExpr(const Expr *) const { return false; }
   virtual bool isSafeDecl(const Decl *) const { return false; }
-  virtual const char *ptrKind() const = 0;
+  virtual const char *typeName() const = 0;
 
   void checkASTDecl(const TranslationUnitDecl *TUD, AnalysisManager &MGR,
                     BugReporter &BRArg) const {
@@ -118,14 +119,14 @@ class RawPtrRefCallArgsChecker
           isa<CXXOperatorCallExpr>(CE) && isa_and_nonnull<CXXMethodDecl>(F);
 
       if (auto *MemberCallExpr = dyn_cast<CXXMemberCallExpr>(CE))
-        checkThisArg(MemberCallExpr, D);
+        checkThisArg(F, MemberCallExpr, D);
 
       if (ArgIdx) {
         auto *Arg = CE->getArg(0);
         QualType ArgType = Arg->getType().getCanonicalType();
         std::optional<bool> IsUnsafe = isUnsafeType(ArgType);
         if (IsUnsafe && *IsUnsafe && !isPtrOriginSafe(Arg))
-          reportBugOnThis(Arg, D);
+          reportBugOnThis(F, Arg, D);
       }
 
       for (auto P = F->param_begin();
@@ -133,11 +134,11 @@ class RawPtrRefCallArgsChecker
         // TODO: attributes.
         // if ((*P)->hasAttr<SafeRefCntblRawPtrAttr>())
         //  continue;
-        checkArg(CE->getArg(ArgIdx), (*P)->getType(), *P, D);
+        checkArg(F, CE->getArg(ArgIdx), (*P)->getType(), *P, D);
       }
       for (; ArgIdx < CE->getNumArgs(); ++ArgIdx) {
         auto *Arg = CE->getArg(ArgIdx);
-        checkArg(Arg, Arg->getType(), nullptr, D);
+        checkArg(F, Arg, Arg->getType(), nullptr, D);
       }
     }
   }
@@ -153,15 +154,15 @@ class RawPtrRefCallArgsChecker
       if (auto *FnType = Decl->getFunctionType()) {
         if (auto *ProtoType = dyn_cast<FunctionProtoType>(FnType)) {
           if (auto *MemberCallExpr = dyn_cast<CXXMemberCallExpr>(CE))
-            checkThisArg(MemberCallExpr, D);
+            checkThisArg(nullptr, MemberCallExpr, D);
           unsigned ArgIdx = 0;
           for (auto PT = ProtoType->param_type_begin();
                PT < ProtoType->param_type_end() && ArgIdx < CE->getNumArgs();
                ++PT, ++ArgIdx)
-            checkArg(CE->getArg(ArgIdx), *PT, nullptr, D);
+            checkArg(nullptr, CE->getArg(ArgIdx), *PT, nullptr, D);
           for (; ArgIdx < CE->getNumArgs(); ++ArgIdx) {
             auto *Arg = CE->getArg(ArgIdx);
-            checkArg(Arg, Arg->getType(), nullptr, D);
+            checkArg(nullptr, Arg, Arg->getType(), nullptr, D);
           }
         }
       }
@@ -188,7 +189,7 @@ class RawPtrRefCallArgsChecker
         auto SelectorName = E->getSelector().getNameForSlot(0);
         if (SelectorName == "isEqual" || SelectorName == "isEqualToString")
           return;
-        reportBugOnReceiver(Receiver, D);
+        reportBugOnReceiver(E->getMethodDecl(), Receiver, D);
       }
     }
 
@@ -207,11 +208,12 @@ class RawPtrRefCallArgsChecker
         continue;
       if (isPtrOriginSafe(Arg))
         continue;
-      reportBug(Arg, Param, D);
+      reportBug(MethodDecl, Arg, Param, D);
     }
   }
 
-  void checkThisArg(const CXXMemberCallExpr *MemberCallExpr,
+  void checkThisArg(const NamedDecl *Callee,
+                    const CXXMemberCallExpr *MemberCallExpr,
                     const Decl *DeclWithIssue) const {
     if (auto *MD = MemberCallExpr->getMethodDecl()) {
       auto name = safeGetName(MD);
@@ -230,11 +232,11 @@ class RawPtrRefCallArgsChecker
     if (isPtrOriginSafe(ThisExpr))
       return;
 
-    reportBugOnThis(MemberCallExpr, DeclWithIssue);
+    reportBugOnThis(Callee, ThisExpr, DeclWithIssue);
   }
 
-  void checkArg(const Expr *Arg, QualType ParamType, const ParmVarDecl *Param,
-                const Decl *DeclWithIssue) const {
+  void checkArg(const NamedDecl *Callee, const Expr *Arg, QualType ParamType,
+                const ParmVarDecl *Param, const Decl *DeclWithIssue) const {
     std::optional<bool> IsUncounted = isUnsafePtr(ParamType);
     if (!IsUncounted || !(*IsUncounted))
       return;
@@ -245,7 +247,7 @@ class RawPtrRefCallArgsChecker
     if (isPtrOriginSafe(Arg))
       return;
 
-    reportBug(Arg, Param, DeclWithIssue);
+    reportBug(Callee, Arg, Param, DeclWithIssue);
   }
 
   bool isPtrOriginSafe(const Expr *Arg) const {
@@ -378,8 +380,8 @@ class RawPtrRefCallArgsChecker
             ClsName.ends_with("String"));
   }
 
-  void reportBug(const Expr *CallArg, const ParmVarDecl *Param,
-                 const Decl *DeclWithIssue) const {
+  void reportBug(const NamedDecl *Callee, const Expr *CallArg,
+                 const ParmVarDecl *Param, const Decl *DeclWithIssue) const {
     assert(CallArg);
 
     SmallString<100> Buf;
@@ -387,11 +389,29 @@ class RawPtrRefCallArgsChecker
 
     const std::string paramName = safeGetName(Param);
     Os << "Call argument";
+    printArgument(Os, CallArg, DeclWithIssue);
     if (!paramName.empty()) {
       Os << " for parameter ";
       printQuotedQualifiedName(Os, Param);
     }
-    Os << " is " << ptrKind() << " and unsafe.";
+    if (Callee) {
+      Os << " of ";
+      printQuotedQualifiedName(Os, Callee);
+    }
+    Os << " is a ";
+    auto *ArgType = CallArg->getType().getTypePtr();
+
+    if (printPointer(Os, ArgType) == PrintDeclKind::Pointer) {
+      assert(RTC);
+      if (auto *Decl = RTC->getCanonicalDecl(CallArg->getType()))
+        printQuotedQualifiedName(Os, Decl);
+      else {
+        auto Typedef = ArgType->getAs<TypedefType>();
+        assert(Typedef);
+        printQuotedQualifiedName(Os, Typedef->getDecl());
+      }
+    } else
+      printType(Os, CallArg->getType());
 
     bool usesDefaultArgValue = isa<CXXDefaultArgExpr>(CallArg) && Param;
     const SourceLocation SrcLocToReport =
@@ -405,15 +425,23 @@ class RawPtrRefCallArgsChecker
     BR->emitReport(std::move(Report));
   }
 
-  void reportBugOnThis(const Expr *CallArg, const Decl *DeclWithIssue) const {
+  void reportBugOnThis(const NamedDecl *Callee, const Expr *CallArg,
+                       const Decl *DeclWithIssue) const {
     assert(CallArg);
 
     const SourceLocation SrcLocToReport = CallArg->getSourceRange().getBegin();
 
     SmallString<100> Buf;
     llvm::raw_svector_ostream Os(Buf);
-    Os << "Call argument for 'this' parameter is " << ptrKind();
-    Os << " and unsafe.";
+    Os << "Call argument";
+    printArgument(Os, CallArg, DeclWithIssue);
+    Os << " for 'this' parameter";
+    if (Callee) {
+      Os << " of ";
+      printQuotedQualifiedName(Os, Callee);
+    }
+    Os << " is a raw pointer to " << typeName();
+    printType(Os, CallArg->getType());
 
     PathDiagnosticLocation BSLoc(SrcLocToReport, BR->getSourceManager());
     auto Report = std::make_unique<BasicBugReport>(Bug, Os.str(), BSLoc);
@@ -422,7 +450,7 @@ class RawPtrRefCallArgsChecker
     BR->emitReport(std::move(Report));
   }
 
-  void reportBugOnReceiver(const Expr *CallArg,
+  void reportBugOnReceiver(const NamedDecl *Callee, const Expr *CallArg,
                            const Decl *DeclWithIssue) const {
     assert(CallArg);
 
@@ -430,7 +458,14 @@ class RawPtrRefCallArgsChecker
 
     SmallString<100> Buf;
     llvm::raw_svector_ostream Os(Buf);
-    Os << "Receiver is " << ptrKind() << " and unsafe.";
+    Os << "Receiver";
+    printArgument(Os, CallArg, DeclWithIssue);
+    if (Callee) {
+      Os << " of ";
+      printQuotedQualifiedName(Os, Callee);
+    }
+    Os << " is a raw pointer to " << typeName();
+    printType(Os, CallArg->getType());
 
     PathDiagnosticLocation BSLoc(SrcLocToReport, BR->getSourceManager());
     auto Report = std::make_unique<BasicBugReport>(Bug, Os.str(), BSLoc);
@@ -438,6 +473,47 @@ class RawPtrRefCallArgsChecker
     Report->setDeclWithIssue(DeclWithIssue);
     BR->emitReport(std::move(Report));
   }
+
+  void printArgument(llvm::raw_svector_ostream &Os, const Expr* Arg,
+                     const Decl* D) const {
+    SmallString<100> Buf;
+    llvm::raw_svector_ostream ArgOs(Buf);
+    Arg->printPretty(ArgOs, /*Helper=*/nullptr,
+                     D->getASTContext().getPrintingPolicy());
+    auto ArgCode = ArgOs.str();
+    if (ArgCode.contains('\n'))
+      return;
+    ArgCode = ArgCode.slice(0, 50);
+    if (ArgCode.size() == 50)
+      Os << " '" << ArgCode << "...'";
+    else
+      Os << " '" << ArgCode << "'";
+  }
+
+  enum class PrintDeclKind { Pointee, Pointer };
+  virtual PrintDeclKind printPointer(llvm::raw_svector_ostream &Os,
+                                     const Type *T) const {
+    T = T->getUnqualifiedDesugaredType();
+    bool IsPtr = isa<PointerType>(T) || isa<ObjCObjectPointerType>(T);
+    Os << "raw " << (IsPtr ? "pointer" : "reference") << " to " << typeName();
+    return PrintDeclKind::Pointee;
+  }
+
+  void printType(llvm::raw_svector_ostream &Os, const QualType QT) const {
+    auto* ArgType = QT.getTypePtr();
+    if (auto *CXXRD = ArgType->getPointeeCXXRecordDecl()) {
+      Os << " ";
+      printQuotedQualifiedName(Os, CXXRD);
+    } else if (auto *ObjCDecl = getObjCDeclFromObjCPtr(ArgType)) {
+      Os << " ";
+      printQuotedQualifiedName(Os, ObjCDecl);
+    } else if (!ArgType->isPointerOrReferenceType()) {
+      if (auto *RD = ArgType->getAsRecordDecl()) {
+        Os << " ";
+        printQuotedQualifiedName(Os, RD);
+      }
+    }
+  }
 };
 
 class UncountedCallArgsChecker final : public RawPtrRefCallArgsChecker {
@@ -462,7 +538,7 @@ class UncountedCallArgsChecker final : public 
RawPtrRefCallArgsChecker {
     return isRefOrCheckedPtrType(type);
   }
 
-  const char *ptrKind() const final { return "uncounted"; }
+  const char *typeName() const final { return "ref-countable type"; }
 };
 
 class UncheckedCallArgsChecker final : public RawPtrRefCallArgsChecker {
@@ -491,7 +567,7 @@ class UncheckedCallArgsChecker final : public 
RawPtrRefCallArgsChecker {
     return isExprToGetCheckedPtrCapableMember(E);
   }
 
-  const char *ptrKind() const final { return "unchecked"; }
+  const char *typeName() const final { return "CheckedPtr capable type"; }
 };
 
 class UnretainedCallArgsChecker final : public RawPtrRefCallArgsChecker {
@@ -523,7 +599,16 @@ class UnretainedCallArgsChecker final : public 
RawPtrRefCallArgsChecker {
     return BR->getSourceManager().isInSystemHeader(D->getLocation());
   }
 
-  const char *ptrKind() const final { return "unretained"; }
+  PrintDeclKind printPointer(llvm::raw_svector_ostream &Os,
+                             const Type *T) const final {
+    if (!isa<ObjCObjectPointerType>(T) && T->getAs<TypedefType>()) {
+      Os << typeName() << " ";
+      return PrintDeclKind::Pointer;
+    }
+    return RawPtrRefCallArgsChecker::printPointer(Os, T);
+  }
+
+  const char *typeName() const final { return "retainable type"; }
 };
 
 } // namespace
diff --git 
a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp
index 0e23ae34ea212..a541d021622f5 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp
@@ -6,6 +6,7 @@
 //
 
//===----------------------------------------------------------------------===//
 
+#include "ASTUtils.h"
 #include "DiagOutputUtils.h"
 #include "PtrTypesSemantics.h"
 #include "clang/AST/Decl.h"
@@ -108,24 +109,10 @@ class RawPtrRefMemberChecker
 
     if (auto *MemberCXXRD = MemberType->getPointeeCXXRecordDecl())
       reportBug(Member, MemberType, MemberCXXRD, RD);
-    else if (auto *ObjCDecl = getObjCDecl(MemberType))
+    else if (auto *ObjCDecl = getObjCDeclFromObjCPtr(MemberType))
       reportBug(Member, MemberType, ObjCDecl, RD);
   }
 
-  ObjCInterfaceDecl *getObjCDecl(const Type *TypePtr) const {
-    auto *PointeeType = TypePtr->getPointeeType().getTypePtrOrNull();
-    if (!PointeeType)
-      return nullptr;
-    auto *Desugared = PointeeType->getUnqualifiedDesugaredType();
-    if (!Desugared)
-      return nullptr;
-    if (auto *ObjCType = dyn_cast<ObjCInterfaceType>(Desugared))
-      return ObjCType->getDecl();
-    if (auto *ObjCType = dyn_cast<ObjCObjectType>(Desugared))
-      return ObjCType->getInterface();
-    return nullptr;
-  }
-
   void visitObjCDecl(const ObjCContainerDecl *CD) const {
     if (BR->getSourceManager().isInSystemHeader(CD->getLocation()))
       return;
@@ -169,7 +156,7 @@ class RawPtrRefMemberChecker
 
     if (auto *MemberCXXRD = IvarType->getPointeeCXXRecordDecl())
       reportBug(Ivar, IvarType, MemberCXXRD, CD);
-    else if (auto *ObjCDecl = getObjCDecl(IvarType))
+    else if (auto *ObjCDecl = getObjCDeclFromObjCPtr(IvarType))
       reportBug(Ivar, IvarType, ObjCDecl, CD);
   }
 
@@ -190,7 +177,7 @@ class RawPtrRefMemberChecker
 
     if (auto *MemberCXXRD = PropType->getPointeeCXXRecordDecl())
       reportBug(PD, PropType, MemberCXXRD, CD);
-    else if (auto *ObjCDecl = getObjCDecl(PropType))
+    else if (auto *ObjCDecl = getObjCDeclFromObjCPtr(PropType))
       reportBug(PD, PropType, ObjCDecl, CD);
   }
 
@@ -214,7 +201,7 @@ class RawPtrRefMemberChecker
 
     if (auto *MemberCXXRD = PropType->getPointeeCXXRecordDecl())
       reportBug(PropDecl, PropType, MemberCXXRD, CD);
-    else if (auto *ObjCDecl = getObjCDecl(PropType))
+    else if (auto *ObjCDecl = getObjCDeclFromObjCPtr(PropType))
       reportBug(PropDecl, PropType, ObjCDecl, CD);
   }
 
diff --git a/clang/test/Analysis/Checkers/WebKit/binding-to-refptr.cpp 
b/clang/test/Analysis/Checkers/WebKit/binding-to-refptr.cpp
index 796d56beaf07f..49d922275f2b9 100644
--- a/clang/test/Analysis/Checkers/WebKit/binding-to-refptr.cpp
+++ b/clang/test/Analysis/Checkers/WebKit/binding-to-refptr.cpp
@@ -38,9 +38,9 @@ static void testUnpackedAssignmentWithWeak() {
   auto [a, b] = getStrongWeakPair();
   a->nextSibling();
   b->nextSibling();
-  // expected-warning@-1{{Call argument for 'this' parameter is uncounted and 
unsafe [alpha.webkit.UncountedCallArgsChecker]}}
+  // expected-warning@-1{{Call argument 'b' for 'this' parameter of 
'Node::nextSibling' is a raw pointer to ref-countable type 'Node'}}
   auto [c, d] = getWeakStrongPair();
   c->nextSibling();
-  // expected-warning@-1{{Call argument for 'this' parameter is uncounted and 
unsafe [alpha.webkit.UncountedCallArgsChecker]}}
+  // expected-warning@-1{{Call argument 'c' for 'this' parameter of 
'Node::nextSibling' is a raw pointer to ref-countable type 'Node'}}
   d->nextSibling();
 }
diff --git 
a/clang/test/Analysis/Checkers/WebKit/call-args-checked-const-member.cpp 
b/clang/test/Analysis/Checkers/WebKit/call-args-checked-const-member.cpp
index 7959daf0ceaaf..bc95deede57bb 100644
--- a/clang/test/Analysis/Checkers/WebKit/call-args-checked-const-member.cpp
+++ b/clang/test/Analysis/Checkers/WebKit/call-args-checked-const-member.cpp
@@ -17,7 +17,7 @@ class Foo {
 void Foo::bar() {
   m_obj1->method();
   m_obj2->method();
-  // expected-warning@-1{{Call argument for 'this' parameter is unchecked and 
unsafe}}
+  // expected-warning@-1{{Call argument 'this->m_obj2' for 'this' parameter of 
'CheckedObj::method' is a raw pointer to CheckedPtr capable type 'CheckedObj'}}
 }
 
 } // namespace call_args_const_checkedptr_member
@@ -37,7 +37,7 @@ class Foo {
 void Foo::bar() {
   m_obj1->method();
   m_obj2->...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/202724
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to