[clang] [alpha.webkit.UncountedCallArgsChecker] Improve the warning text (PR #202724)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 9 10:48:31 PDT 2026
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 at -1{{Call argument for 'this' parameter is uncounted and unsafe [alpha.webkit.UncountedCallArgsChecker]}}
+ // expected-warning at -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 at -1{{Call argument for 'this' parameter is uncounted and unsafe [alpha.webkit.UncountedCallArgsChecker]}}
+ // expected-warning at -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 at -1{{Call argument for 'this' parameter is unchecked and unsafe}}
+ // expected-warning at -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
More information about the cfe-commits
mailing list