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
