Author: Ryosuke Niwa Date: 2026-07-13T07:00:32-07:00 New Revision: da1e5f1f6c096f360abe39ad2f7d235b6d270a70
URL: https://github.com/llvm/llvm-project/commit/da1e5f1f6c096f360abe39ad2f7d235b6d270a70 DIFF: https://github.com/llvm/llvm-project/commit/da1e5f1f6c096f360abe39ad2f7d235b6d270a70.diff LOG: [alpha.webkit.UncheckedLocalVarsChecker] Improve the warning text (#208855) This PR aligns UncheckedLocalVarsChecker and its variant's warning message with the new warning format in https://github.com/llvm/llvm-project/pull/202724. Added: Modified: clang/lib/StaticAnalyzer/Checkers/WebKit/DiagOutputUtils.h clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefCallArgsChecker.cpp clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp clang/test/Analysis/Checkers/WebKit/local-vars-checked-const-member.cpp clang/test/Analysis/Checkers/WebKit/local-vars-counted-const-member.cpp clang/test/Analysis/Checkers/WebKit/member-function-pointer-crash.cpp clang/test/Analysis/Checkers/WebKit/unchecked-local-vars.cpp clang/test/Analysis/Checkers/WebKit/uncounted-local-vars.cpp clang/test/Analysis/Checkers/WebKit/unretained-local-vars-arc.mm clang/test/Analysis/Checkers/WebKit/unretained-local-vars.mm Removed: ################################################################################ diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/DiagOutputUtils.h b/clang/lib/StaticAnalyzer/Checkers/WebKit/DiagOutputUtils.h index 781a8d746001f..586a0ec9ece98 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/DiagOutputUtils.h +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/DiagOutputUtils.h @@ -9,6 +9,7 @@ #ifndef LLVM_CLANG_ANALYZER_WEBKIT_DIAGPRINTUTILS_H #define LLVM_CLANG_ANALYZER_WEBKIT_DIAGPRINTUTILS_H +#include "ASTUtils.h" #include "clang/AST/Decl.h" #include "llvm/Support/raw_ostream.h" @@ -31,6 +32,23 @@ void printQuotedName(llvm::raw_ostream &Os, const NamedDeclDerivedT &D) { Os << "'"; } +inline void printTypeName(llvm::raw_ostream &Os, const QualType QT) { + auto *Type = QT.getTypePtr(); + assert(Type); + if (auto *CXXRD = Type->getPointeeCXXRecordDecl()) { + printQuotedQualifiedName(Os, CXXRD); + return; + } + if (auto *ObjCDecl = getObjCDeclFromObjCPtr(Type)) { + printQuotedQualifiedName(Os, ObjCDecl); + return; + } + if (!Type->isPointerOrReferenceType()) { + if (auto *RD = Type->getAsRecordDecl()) + printQuotedQualifiedName(Os, RD); + } +} + } // namespace clang #endif diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefCallArgsChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefCallArgsChecker.cpp index 5eeefcbd857a6..3859ade53db2e 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefCallArgsChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefCallArgsChecker.cpp @@ -417,7 +417,8 @@ class RawPtrRefCallArgsChecker printQuotedQualifiedName(Os, Typedef->getDecl()); } } else { - printType(Os, CallArg->getType()); + Os << " "; + printTypeName(Os, CallArg->getType()); } bool usesDefaultArgValue = isa<CXXDefaultArgExpr>(CallArg) && Param; @@ -447,8 +448,8 @@ class RawPtrRefCallArgsChecker Os << " to "; printQuotedQualifiedName(Os, Callee); } - Os << ") is a raw pointer to " << typeName(); - printType(Os, CallArg->getType()); + Os << ") is a raw pointer to " << typeName() << " "; + printTypeName(Os, CallArg->getType()); PathDiagnosticLocation BSLoc(SrcLocToReport, BR->getSourceManager()); auto Report = std::make_unique<BasicBugReport>(Bug, Os.str(), BSLoc); @@ -472,8 +473,8 @@ class RawPtrRefCallArgsChecker printQuotedQualifiedName(Os, Callee); Os << ")"; } - Os << " is a raw pointer to " << typeName(); - printType(Os, CallArg->getType()); + Os << " is a raw pointer to " << typeName() << " "; + printTypeName(Os, CallArg->getType()); PathDiagnosticLocation BSLoc(SrcLocToReport, BR->getSourceManager()); auto Report = std::make_unique<BasicBugReport>(Bug, Os.str(), BSLoc); @@ -506,22 +507,6 @@ class RawPtrRefCallArgsChecker 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 { diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp index a0bb75ff879d2..a624b7d686734 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp @@ -207,7 +207,7 @@ class RawPtrRefLocalVarsChecker virtual bool isSafePtrType(const QualType) 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 { @@ -414,9 +414,10 @@ class RawPtrRefLocalVarsChecker llvm::raw_svector_ostream Os(Buf); if (isa<ParmVarDecl>(V)) { - Os << "Assignment to an " << ptrKind() << " parameter "; + Os << "Parameter "; printQuotedQualifiedName(Os, V); - Os << " is unsafe."; + Os << " is a "; + printPointerTypeAndType(Os, V->getType()); PathDiagnosticLocation BSLoc(Value->getExprLoc(), BR->getSourceManager()); auto Report = std::make_unique<BasicBugReport>(Bug, Os.str(), BSLoc); @@ -435,7 +436,8 @@ class RawPtrRefLocalVarsChecker Os << "'" << safeGetName(BindingDecl) << "'"; else printQuotedQualifiedName(Os, V); - Os << " is " << ptrKind() << " and unsafe."; + Os << " is a "; + printPointerTypeAndType(Os, V->getType()); PathDiagnosticLocation BSLoc(V->getLocation(), BR->getSourceManager()); auto Report = std::make_unique<BasicBugReport>(Bug, Os.str(), BSLoc); @@ -444,6 +446,28 @@ class RawPtrRefLocalVarsChecker BR->emitReport(std::move(Report)); } } + + void printPointerTypeAndType(llvm::raw_svector_ostream &Os, + QualType QT) const { + auto *VarType = QT.getTypePtr(); + if (RTC && isa<TypedefType>(VarType)) { + Os << typeName() << " "; + assert(RTC); + if (auto *Decl = RTC->getCanonicalDecl(QT)) { + printQuotedQualifiedName(Os, Decl); + } else { + auto Typedef = VarType->getAs<TypedefType>(); + assert(Typedef); + printQuotedQualifiedName(Os, Typedef->getDecl()); + } + } else { + auto *DesugaredType = VarType->getUnqualifiedDesugaredType(); + bool IsPtr = isa<PointerType, ObjCObjectPointerType>(DesugaredType); + Os << "raw " << (IsPtr ? "pointer" : "reference") << " to "; + Os << typeName() << " "; + printTypeName(Os, QT); + } + } }; class UncountedLocalVarsChecker final : public RawPtrRefLocalVarsChecker { @@ -460,7 +484,7 @@ class UncountedLocalVarsChecker final : public RawPtrRefLocalVarsChecker { bool isSafePtrType(const QualType type) const final { return isRefOrCheckedPtrType(type); } - const char *ptrKind() const final { return "uncounted"; } + const char *typeName() const final { return "RefPtr-capable type"; } }; class UncheckedLocalVarsChecker final : public RawPtrRefLocalVarsChecker { @@ -480,7 +504,7 @@ class UncheckedLocalVarsChecker final : public RawPtrRefLocalVarsChecker { bool isSafeExpr(const Expr *E) const final { return isExprToGetCheckedPtrCapableMember(E); } - const char *ptrKind() const final { return "unchecked"; } + const char *typeName() const final { return "CheckedPtr-capable type"; } }; class UnretainedLocalVarsChecker final : public RawPtrRefLocalVarsChecker { @@ -505,7 +529,7 @@ class UnretainedLocalVarsChecker final : public RawPtrRefLocalVarsChecker { // Treat NS/CF globals in system header as immortal. return BR->getSourceManager().isInSystemHeader(D->getLocation()); } - const char *ptrKind() const final { return "unretained"; } + const char *typeName() const final { return "RetainPtr-capable type"; } }; } // namespace diff --git a/clang/test/Analysis/Checkers/WebKit/local-vars-checked-const-member.cpp b/clang/test/Analysis/Checkers/WebKit/local-vars-checked-const-member.cpp index bf58e676f3bb0..71c99d77f8c0d 100644 --- a/clang/test/Analysis/Checkers/WebKit/local-vars-checked-const-member.cpp +++ b/clang/test/Analysis/Checkers/WebKit/local-vars-checked-const-member.cpp @@ -46,12 +46,12 @@ void Foo::bar() { auto* obj1 = m_obj1.get(); obj1->method(); auto* obj2 = m_obj2.get(); - // expected-warning@-1{{Local variable 'obj2' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'obj2' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} obj2->method(); auto& obj3 = ensureObj3(); obj3.method(); auto& obj4 = ensureObj4(); - // expected-warning@-1{{Local variable 'obj4' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'obj4' is a raw reference to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} obj4.method(); auto* obj5 = ensureObj5(); } @@ -74,7 +74,7 @@ void Foo::bar() { auto& obj1 = m_obj1.get(); obj1.method(); auto& obj2 = m_obj2.get(); - // expected-warning@-1{{Local variable 'obj2' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'obj2' is a raw reference to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} obj2.method(); } @@ -96,7 +96,7 @@ void Foo::bar() { auto* obj1 = m_obj1.get(); obj1->method(); auto* obj2 = m_obj2.get(); - // expected-warning@-1{{Local variable 'obj2' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'obj2' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} obj2->method(); } diff --git a/clang/test/Analysis/Checkers/WebKit/local-vars-counted-const-member.cpp b/clang/test/Analysis/Checkers/WebKit/local-vars-counted-const-member.cpp index 5f35535bde3aa..d614a2034a93a 100644 --- a/clang/test/Analysis/Checkers/WebKit/local-vars-counted-const-member.cpp +++ b/clang/test/Analysis/Checkers/WebKit/local-vars-counted-const-member.cpp @@ -46,12 +46,12 @@ void Foo::bar() { auto* obj1 = m_obj1.get(); obj1->method(); auto* obj2 = m_obj2.get(); - // expected-warning@-1{{Local variable 'obj2' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'obj2' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} obj2->method(); auto& obj3 = ensureObj3(); obj3.method(); auto& obj4 = ensureObj4(); - // expected-warning@-1{{Local variable 'obj4' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'obj4' is a raw reference to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} obj4.method(); auto* obj5 = ensureObj5(); } @@ -74,7 +74,7 @@ void Foo::bar() { auto& obj1 = m_obj1.get(); obj1.method(); auto& obj2 = m_obj2.get(); - // expected-warning@-1{{Local variable 'obj2' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'obj2' is a raw reference to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} obj2.method(); } @@ -96,7 +96,7 @@ void Foo::bar() { auto* obj1 = m_obj1.get(); obj1->method(); auto* obj2 = m_obj2.get(); - // expected-warning@-1{{Local variable 'obj2' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'obj2' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} obj2->method(); } diff --git a/clang/test/Analysis/Checkers/WebKit/member-function-pointer-crash.cpp b/clang/test/Analysis/Checkers/WebKit/member-function-pointer-crash.cpp index 16d3b89b3ac4e..227d1607dd728 100644 --- a/clang/test/Analysis/Checkers/WebKit/member-function-pointer-crash.cpp +++ b/clang/test/Analysis/Checkers/WebKit/member-function-pointer-crash.cpp @@ -18,7 +18,7 @@ class FillLayersPropertyWrapper { bool canInterpolate(const RenderStyle& from) const { auto* fromLayer = &(from.*m_layersGetter)(); - // expected-warning@-1{{Local variable 'fromLayer' is uncounted and unsafe}} + // expected-warning@-1{{Local variable 'fromLayer' is a raw pointer to RefPtr-capable type 'FillLayer'}} return true; } diff --git a/clang/test/Analysis/Checkers/WebKit/unchecked-local-vars.cpp b/clang/test/Analysis/Checkers/WebKit/unchecked-local-vars.cpp index f74e5abffea74..a0ce0ffbff90d 100644 --- a/clang/test/Analysis/Checkers/WebKit/unchecked-local-vars.cpp +++ b/clang/test/Analysis/Checkers/WebKit/unchecked-local-vars.cpp @@ -14,7 +14,7 @@ void bar(CheckedObj *) {} void baz() { CheckedObj *bar; - // expected-warning@-1{{Local variable 'bar' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} someFunction(); } } // namespace raw_ptr @@ -23,7 +23,7 @@ namespace reference { void foo_ref() { CheckedObj automatic; CheckedObj &bar = automatic; - // expected-warning@-1{{Local variable 'bar' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw reference to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} someFunction(); bar.method(); } @@ -46,7 +46,7 @@ void foo2() { CheckedPtr<CheckedObj> foo; // missing embedded scope here CheckedObj *bar = foo.get(); - // expected-warning@-1{{Local variable 'bar' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} someFunction(); bar->method(); } @@ -74,7 +74,7 @@ void foo5() { void foo6() { CheckedPtr<CheckedObj> foo; auto* bar = foo.get(); - // expected-warning@-1{{Local variable 'bar' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} bar->method(); } @@ -96,17 +96,17 @@ class Foo { void evil_func() { CheckedObj *bar = provide_ref_ctnbl(); - // expected-warning@-1{{Local variable 'bar' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} auto *baz = provide_ref_ctnbl(); - // expected-warning@-1{{Local variable 'baz' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'baz' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} auto *baz2 = this->provide_ref_ctnbl(); - // expected-warning@-1{{Local variable 'baz2' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'baz2' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} [[clang::suppress]] auto *baz_suppressed = provide_ref_ctnbl(); // no-warning } void func() { CheckedObj *bar = provide_ref_ctnbl(); - // expected-warning@-1{{Local variable 'bar' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} if (bar) bar->method(); } @@ -167,26 +167,26 @@ void foo() { void bar() { if (CheckedObj *a = provide_ref_ctnbl()) { - // expected-warning@-1{{Local variable 'a' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'a' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} a->method(); } for (CheckedObj *b = provide_ref_ctnbl(); b != nullptr;) { - // expected-warning@-1{{Local variable 'b' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'b' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} b->method(); } CheckedObj *array[1]; for (CheckedObj *c : array) { - // expected-warning@-1{{Local variable 'c' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'c' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} c->method(); } while (CheckedObj *d = provide_ref_ctnbl()) { - // expected-warning@-1{{Local variable 'd' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'd' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} d->method(); } do { CheckedObj *e = provide_ref_ctnbl(); - // expected-warning@-1{{Local variable 'e' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'e' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} e->method(); } while (1); someFunction(); @@ -210,7 +210,7 @@ bool bar(); void foo() { CheckedObj *a = bar() ? nullptr : provide_checkable(); - // expected-warning@-1{{Local variable 'a' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'a' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} CheckedPtr<CheckedObj> b = provide_checkable(); { CheckedObj* c = bar() ? nullptr : b.get(); @@ -228,14 +228,14 @@ CheckedObj *provide_checkable(); void foo(CheckedObj* a) { CheckedObj* b = a; - // expected-warning@-1{{Local variable 'b' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'b' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} if (b->trivial()) b = provide_checkable(); } void bar(CheckedObj* a) { CheckedObj* b; - // expected-warning@-1{{Local variable 'b' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'b' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} b = provide_checkable(); } @@ -243,7 +243,7 @@ void baz() { CheckedPtr a = provide_checkable(); { CheckedObj* b = a.get(); - // expected-warning@-1{{Local variable 'b' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'b' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} b = provide_checkable(); } } @@ -257,7 +257,7 @@ void someFunction(); void foo(CheckedObj* a) { a = provide_checkable(); - // expected-warning@-1{{Assignment to an unchecked parameter 'a' is unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Parameter 'a' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} someFunction(); a->method(); } @@ -271,7 +271,7 @@ void someFunction(); void foo() { static CheckedObj* a = nullptr; - // expected-warning@-1{{Static local variable 'a' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Static local variable 'a' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} a = provide_checkable(); someFunction(); a->method(); @@ -285,7 +285,7 @@ CheckedObj *provide_ref_cntbl(); void someFunction(); CheckedObj* g_a = nullptr; -// expected-warning@-1{{Global variable 'local_assignment_to_global::g_a' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} +// expected-warning@-1{{Global variable 'local_assignment_to_global::g_a' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} void foo() { g_a = provide_ref_cntbl(); @@ -304,13 +304,13 @@ namespace member_var { auto *a = &checked; a->method(); auto *b = &checkedRef; - // expected-warning@-1{{Local variable 'b' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'b' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} b->method(); } void bar(WrapperObj& wrapper) { CheckedObj* ptr = &wrapper.checked; - // expected-warning@-1{{Local variable 'ptr' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'ptr' is a raw pointer to CheckedPtr-capable type 'CheckedObj' [alpha.webkit.UncheckedLocalVarsChecker]}} ptr->method(); } }; @@ -323,7 +323,7 @@ RefCountableAndCheckable* provide_obj(); void local_raw_ptr() { RefCountableAndCheckable* a = nullptr; - // expected-warning@-1{{Local variable 'a' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'a' is a raw pointer to CheckedPtr-capable type 'RefCountableAndCheckable' [alpha.webkit.UncheckedLocalVarsChecker]}} a = provide_obj(); a->method(); } @@ -346,7 +346,7 @@ void local_var_with_guardian_checked_ptr_with_assignment() { RefPtr<RefCountableAndCheckable> a = provide_obj(); { RefCountableAndCheckable* b = a.get(); - // expected-warning@-1{{Local variable 'b' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'b' is a raw pointer to CheckedPtr-capable type 'RefCountableAndCheckable' [alpha.webkit.UncheckedLocalVarsChecker]}} b = provide_obj(); b->method(); } @@ -362,7 +362,7 @@ void local_var_with_guardian_checked_ref() { void static_var() { static RefCountableAndCheckable* a = nullptr; - // expected-warning@-1{{Static local variable 'a' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}} + // expected-warning@-1{{Static local variable 'a' is a raw pointer to CheckedPtr-capable type 'RefCountableAndCheckable' [alpha.webkit.UncheckedLocalVarsChecker]}} a = provide_obj(); } diff --git a/clang/test/Analysis/Checkers/WebKit/uncounted-local-vars.cpp b/clang/test/Analysis/Checkers/WebKit/uncounted-local-vars.cpp index 4bf0b3793f85e..d36e78f12453f 100644 --- a/clang/test/Analysis/Checkers/WebKit/uncounted-local-vars.cpp +++ b/clang/test/Analysis/Checkers/WebKit/uncounted-local-vars.cpp @@ -14,7 +14,7 @@ void bar(RefCountable *) {} void baz() { RefCountable *bar; - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} someFunction(); } } // namespace raw_ptr @@ -23,7 +23,7 @@ namespace reference { void foo_ref() { RefCountable automatic; RefCountable &bar = automatic; - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw reference to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} someFunction(); bar.method(); } @@ -31,7 +31,7 @@ void foo_ref() { void foo_ref_trivial() { RefCountable automatic; RefCountable &bar = automatic; - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw reference to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} } void bar_ref(RefCountable &) {} @@ -47,7 +47,7 @@ void foo2() { RefPtr<RefCountable> foo; // missing embedded scope here RefCountable *bar = foo.get(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} someFunction(); bar->method(); } @@ -69,7 +69,7 @@ void foo4() { void foo5() { RefPtr<RefCountable> foo; auto* bar = foo.get(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} bar->trivial(); { auto* baz = foo.get(); @@ -80,7 +80,7 @@ void foo5() { void foo6() { RefPtr<RefCountable> foo; auto* bar = foo.get(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} bar->method(); } @@ -98,14 +98,14 @@ void foo8(RefCountable* obj) { RefPtr<RefCountable> foo; { RefCountable *bar = foo.get(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} foo = nullptr; bar->method(); } RefPtr<RefCountable> baz; { RefCountable *bar = baz.get(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} baz = obj; bar->method(); } @@ -118,19 +118,19 @@ void foo8(RefCountable* obj) { foo = obj; { RefCountable *bar = foo.get(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} foo.releaseNonNull(); bar->method(); } { RefCountable *bar = foo.get(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} foo = obj ? obj : nullptr; bar->method(); } { RefCountable *bar = foo->trivial() ? foo.get() : nullptr; - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} foo = nullptr; foo = (RefCountable *)0; bar->method(); @@ -149,38 +149,38 @@ void foo9(RefCountable& o) { Ref<RefCountable> guardian(o); { RefCountable &bar = guardian.get(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw reference to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} guardian = o; // We don't detect that we're setting it to the same value. bar.method(); } { RefCountable *bar = guardian.ptr(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} Ref<RefCountable> other(*bar); // We don't detect other has the same value as guardian. guardian.swap(other); bar->method(); } { RefCountable *bar = guardian.ptr(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} Ref<RefCountable> other(static_cast<Ref<RefCountable>&&>(guardian)); bar->method(); } { RefCountable *bar = guardian.ptr(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} guardian.leakRef(); bar->method(); } { RefCountable *bar = guardian.ptr(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} guardian = o.trivial() ? o : *bar; bar->method(); } { RefCountable *bar = guardian.ptr(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} { Ref<RefCountable> oldGuardian = std::exchange(guardian, nullptr); } @@ -188,26 +188,26 @@ void foo9(RefCountable& o) { } { RefCountable *bar = guardian.ptr(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} consumeRef(guardian); bar->method(); } { RefCountable *bar = guardian.ptr(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} Consumer consumer(guardian); bar->method(); } { RefCountable *bar = guardian.ptr(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} Consumer consumer; consumer.mutate(guardian); bar->method(); } { RefCountable *bar = guardian.ptr(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} Consumer consumer; consumer << guardian; bar->method(); @@ -222,17 +222,17 @@ class Foo { void evil_func() { RefCountable *bar = provide_ref_ctnbl(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} auto *baz = provide_ref_ctnbl(); - // expected-warning@-1{{Local variable 'baz' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'baz' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} auto *baz2 = this->provide_ref_ctnbl(); - // expected-warning@-1{{Local variable 'baz2' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'baz2' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} [[clang::suppress]] auto *baz_suppressed = provide_ref_ctnbl(); // no-warning } void func() { RefCountable *bar = provide_ref_ctnbl(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} if (bar) bar->method(); } @@ -307,26 +307,26 @@ void foo() { void bar() { if (RefCountable *a = provide_ref_ctnbl()) { - // expected-warning@-1{{Local variable 'a' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} - a->method(); + // expected-warning@-1{{Local variable 'a' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} + a->method(); } for (RefCountable *b = provide_ref_ctnbl(); b != nullptr;) { - // expected-warning@-1{{Local variable 'b' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'b' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} b->method(); } RefCountable *array[1]; for (RefCountable *c : array) { - // expected-warning@-1{{Local variable 'c' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'c' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} c->method(); } while (RefCountable *d = provide_ref_ctnbl()) { - // expected-warning@-1{{Local variable 'd' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'd' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} d->method(); } do { RefCountable *e = provide_ref_ctnbl(); - // expected-warning@-1{{Local variable 'e' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'e' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} e->method(); } while (1); someFunction(); @@ -350,7 +350,7 @@ bool bar(); void foo() { RefCountable *a = bar() ? nullptr : provide_ref_ctnbl(); - // expected-warning@-1{{Local variable 'a' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'a' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} RefPtr<RefCountable> b = provide_ref_ctnbl(); { RefCountable* c = bar() ? nullptr : b.get(); @@ -368,14 +368,14 @@ RefCountable *provide_ref_cntbl(); void foo(RefCountable* a) { RefCountable* b = a; - // expected-warning@-1{{Local variable 'b' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'b' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} if (b->trivial()) b = provide_ref_cntbl(); } void bar(RefCountable* a) { RefCountable* b; - // expected-warning@-1{{Local variable 'b' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'b' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} b = provide_ref_cntbl(); } @@ -383,7 +383,7 @@ void baz() { RefPtr a = provide_ref_cntbl(); { RefCountable* b = a.get(); - // expected-warning@-1{{Local variable 'b' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'b' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} b = provide_ref_cntbl(); } } @@ -396,7 +396,7 @@ RefCountable *provide_ref_cntbl(); void foo(RefPtr<RefCountable>& arg) { RefCountable* ptr = arg.get(); - // expected-warning@-1{{Local variable 'ptr' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'ptr' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} arg = nullptr; ptr->method(); } @@ -410,7 +410,7 @@ void someFunction(); void foo(RefCountable* a) { a = provide_ref_cntbl(); - // expected-warning@-1{{Assignment to an uncounted parameter 'a' is unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Parameter 'a' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} someFunction(); a->method(); } @@ -424,7 +424,7 @@ void someFunction(); void foo() { static RefCountable* a = nullptr; - // expected-warning@-1{{Static local variable 'a' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Static local variable 'a' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} a = provide_ref_cntbl(); someFunction(); a->method(); @@ -438,7 +438,7 @@ RefCountable *provide_ref_cntbl(); void someFunction(); RefCountable* g_a = nullptr; -// expected-warning@-1{{Global variable 'local_assignment_to_global::g_a' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} +// expected-warning@-1{{Global variable 'local_assignment_to_global::g_a' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} void foo() { g_a = provide_ref_cntbl(); @@ -454,7 +454,7 @@ RefCountableAndCheckable* provide_obj(); void local_raw_ptr() { RefCountableAndCheckable* a = nullptr; - // expected-warning@-1{{Local variable 'a' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'a' is a raw pointer to RefPtr-capable type 'RefCountableAndCheckable' [alpha.webkit.UncountedLocalVarsChecker]}} a = provide_obj(); a->method(); } @@ -477,7 +477,7 @@ void local_var_with_guardian_checked_ptr_with_assignment() { CheckedPtr<RefCountableAndCheckable> a = provide_obj(); { RefCountableAndCheckable* b = a.get(); - // expected-warning@-1{{Local variable 'b' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'b' is a raw pointer to RefPtr-capable type 'RefCountableAndCheckable' [alpha.webkit.UncountedLocalVarsChecker]}} b = provide_obj(); b->method(); } @@ -493,7 +493,7 @@ void local_var_with_guardian_checked_ref() { void static_var() { static RefCountableAndCheckable* a = nullptr; - // expected-warning@-1{{Static local variable 'a' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Static local variable 'a' is a raw pointer to RefPtr-capable type 'RefCountableAndCheckable' [alpha.webkit.UncountedLocalVarsChecker]}} a = provide_obj(); } @@ -531,7 +531,7 @@ int TreeNode::recursiveCost() { int TreeNode::recursiveWeight() { unsigned totalCost = weight(); for (TreeNode* node = firstChild; node; node = node->nextSibling) - // expected-warning@-1{{Local variable 'node' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'node' is a raw pointer to RefPtr-capable type 'local_var_in_recursive_function::TreeNode' [alpha.webkit.UncountedLocalVarsChecker]}} totalCost += recursiveWeight(); return totalCost; } @@ -554,9 +554,9 @@ namespace virtual_function { }; void foo(SomeObject* obj) { auto* bar = obj->provide(); - // expected-warning@-1{{Local variable 'bar' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} auto* baz = &*obj; - // expected-warning@-1{{Local variable 'baz' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'baz' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} } } @@ -570,7 +570,7 @@ namespace vardecl_in_if_condition { } RefCountable* get_non_trivial_then() { - if (auto* obj = provide()) // expected-warning{{Local variable 'obj' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + if (auto* obj = provide()) // expected-warning{{Local variable 'obj' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} return obj->next(); return nullptr; } @@ -592,12 +592,12 @@ namespace vardecl_in_if_condition { RefCountable* get_non_trivial_condition() { if (auto* obj = provide(); obj && obj->next()) - return obj; // expected-warning@-1{{Local variable 'obj' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + return obj; // expected-warning@-1{{Local variable 'obj' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} return nullptr; } RefCountable* get_non_trivial_else2() { - if (auto* obj = provide(); !obj) // expected-warning{{Local variable 'obj' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + if (auto* obj = provide(); !obj) // expected-warning{{Local variable 'obj' is a raw pointer to RefPtr-capable type 'RefCountable' [alpha.webkit.UncountedLocalVarsChecker]}} return nullptr; else return obj->next(); @@ -651,8 +651,8 @@ namespace binding_raw_ptr { void bind_return_value() { auto [a, b] = providePair(); - // expected-warning@-1{{Local variable 'a' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} - // expected-warning@-2{{Local variable 'b' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'a' is a raw reference to RefPtr-capable type 'binding_raw_ptr::pair<RefCountable *, RefCountable *>' [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-2{{Local variable 'b' is a raw reference to RefPtr-capable type 'binding_raw_ptr::pair<RefCountable *, RefCountable *>' [alpha.webkit.UncountedLocalVarsChecker]}} a->method(); } @@ -663,8 +663,8 @@ namespace binding_raw_ptr { void bind_temp() { auto [a, b] = pair<RefCountable*, RefCountable*> { provide(), provide() }; - // expected-warning@-1{{Local variable 'a' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} - // expected-warning@-2{{Local variable 'b' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'a' is a raw reference to RefPtr-capable type 'binding_raw_ptr::pair<RefCountable *, RefCountable *>' [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-2{{Local variable 'b' is a raw reference to RefPtr-capable type 'binding_raw_ptr::pair<RefCountable *, RefCountable *>' [alpha.webkit.UncountedLocalVarsChecker]}} a->method(); } @@ -681,15 +681,15 @@ namespace binding_raw_ptr { void bind_local_vars() { RefCountable* s[] = { provide(), provide(), provide() }; auto [a, b, c] = s; - // expected-warning@-1{{Local variable 'a' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} - // expected-warning@-2{{Local variable 'b' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} - // expected-warning@-3{{Local variable 'c' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'a' is a raw reference to RefPtr-capable type}} + // expected-warning@-2{{Local variable 'b' is a raw reference to RefPtr-capable type}} + // expected-warning@-3{{Local variable 'c' is a raw reference to RefPtr-capable type}} a->method(); } void bind_temp_with_safe_ptr() { auto [a, b] = pair<RefCountable*, RefPtr<RefCountable>> { provide(), provide() }; - // expected-warning@-1{{Local variable 'a' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'a' is a raw reference to RefPtr-capable type 'binding_raw_ptr::pair<RefCountable *, RefPtr<RefCountable>>' [alpha.webkit.UncountedLocalVarsChecker]}} a->method(); } @@ -701,7 +701,7 @@ namespace binding_raw_ptr { void bind_temp_struct() { auto [a, b] = provide_ptr_container(); - // expected-warning@-1{{Local variable 'b' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'b' is a raw reference to RefPtr-capable type 'binding_raw_ptr::ptr_container' [alpha.webkit.UncountedLocalVarsChecker]}} a->method(); } diff --git a/clang/test/Analysis/Checkers/WebKit/unretained-local-vars-arc.mm b/clang/test/Analysis/Checkers/WebKit/unretained-local-vars-arc.mm index dbdd941007e5c..3a3127faa4be2 100644 --- a/clang/test/Analysis/Checkers/WebKit/unretained-local-vars-arc.mm +++ b/clang/test/Analysis/Checkers/WebKit/unretained-local-vars-arc.mm @@ -20,7 +20,7 @@ void foo2() { void foo3() { SomeObj *bar = provide(); IOSurfaceRef surface; - // expected-warning@-1{{Local variable 'surface' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'surface' is a RetainPtr-capable type 'IOSurfaceRef' [alpha.webkit.UnretainedLocalVarsChecker]}} } void foo4() { @@ -29,7 +29,7 @@ void foo4() { void bar() { CFMutableArrayRef array = CFArrayCreateMutable(kCFAllocatorDefault, 10); - // expected-warning@-1{{Local variable 'array' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'array' is a RetainPtr-capable type 'CFMutableArrayRef' [alpha.webkit.UnretainedLocalVarsChecker]}} CFArrayAppendValue(array, nullptr); } @@ -56,7 +56,7 @@ void use_const_global() { void use_const_local() { NSString * const str = provide_str(); CFDictionaryRef dict = provide_dict(); - // expected-warning@-1{{Local variable 'dict' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'dict' is a RetainPtr-capable type 'CFDictionaryRef' [alpha.webkit.UnretainedLocalVarsChecker]}} auto dispatch = provide_dispatch(); doWork(str, dict, dispatch); } @@ -78,7 +78,7 @@ - (void)foo:(SomeObj*)obj { - (void)bar { CFMutableArrayRef array = CFArrayCreateMutable(kCFAllocatorDefault, 10); - // expected-warning@-1{{Local variable 'array' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'array' is a RetainPtr-capable type 'CFMutableArrayRef' [alpha.webkit.UnretainedLocalVarsChecker]}} CFArrayAppendValue(array, nullptr); } diff --git a/clang/test/Analysis/Checkers/WebKit/unretained-local-vars.mm b/clang/test/Analysis/Checkers/WebKit/unretained-local-vars.mm index 260e9ce7db83a..a33cf9eec8476 100644 --- a/clang/test/Analysis/Checkers/WebKit/unretained-local-vars.mm +++ b/clang/test/Analysis/Checkers/WebKit/unretained-local-vars.mm @@ -20,7 +20,7 @@ void bar(SomeObj *) {} SomeObj *provide(); void foo_ref() { SomeObj *bar = provide(); - // expected-warning@-1{{Local variable 'bar' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} [bar doWork]; } @@ -30,14 +30,14 @@ bool bar_ref(SomeObj *obj) { void cf_ptr() { CFMutableArrayRef array = CFArrayCreateMutable(kCFAllocatorDefault, 10); - // expected-warning@-1{{Local variable 'array' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'array' is a RetainPtr-capable type 'CFMutableArrayRef' [alpha.webkit.UnretainedLocalVarsChecker]}} CFArrayAppendValue(array, nullptr); } dispatch_queue_t provide_os(); void os_ptr() { auto queue = provide_os(); - // expected-warning@-1{{Local variable 'queue' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'queue' is a raw pointer to RetainPtr-capable type 'NSObject' [alpha.webkit.UnretainedLocalVarsChecker]}} dispatch_queue_get_label(queue); } @@ -56,7 +56,7 @@ void foo2() { RetainPtr<SomeObj> foo = provide(); // missing embedded scope here SomeObj *bar = foo.get(); - // expected-warning@-1{{Local variable 'bar' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} [bar doWork]; } @@ -82,7 +82,7 @@ void foo5() { CFArrayAppendValue(bar, nullptr); } CFMutableArrayRef baz = foo.get(); - // expected-warning@-1{{Local variable 'baz' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'baz' is a RetainPtr-capable type 'CFMutableArrayRef' [alpha.webkit.UnretainedLocalVarsChecker]}} CFArrayAppendValue(baz, nullptr); } @@ -94,7 +94,7 @@ void foo6() { dispatch_queue_get_label(bar); } dispatch_queue_t baz = queue.get(); - // expected-warning@-1{{Local variable 'baz' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'baz' is a RetainPtr-capable type 'dispatch_queue_t' [alpha.webkit.UnretainedLocalVarsChecker]}} dispatch_queue_get_label(baz); } @@ -113,14 +113,14 @@ void foo8(SomeObj* obj) { { SomeObj *bar = foo.get(); - // expected-warning@-1{{Local variable 'bar' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} foo = nullptr; [bar doWork]; } RetainPtr<SomeObj> baz; { SomeObj *bar = baz.get(); - // expected-warning@-1{{Local variable 'bar' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} baz = obj; [bar doWork]; } @@ -134,19 +134,19 @@ void foo8(SomeObj* obj) { foo = obj; { SomeObj *bar = foo.get(); - // expected-warning@-1{{Local variable 'bar' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} foo.clear(); [bar doWork]; } { SomeObj *bar = foo.get(); - // expected-warning@-1{{Local variable 'bar' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} foo = obj ? obj : nullptr; [bar doWork]; } { SomeObj *bar = [foo.get() other] ? foo.get() : nullptr; - // expected-warning@-1{{Local variable 'bar' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} foo = nullptr; [bar doWork]; } @@ -156,32 +156,32 @@ void foo9(SomeObj* o) { RetainPtr<SomeObj> guardian(o); { SomeObj *bar = guardian.get(); - // expected-warning@-1{{Local variable 'bar' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} guardian = o; // We don't detect that we're setting it to the same value. [bar doWork]; } { SomeObj *bar = guardian.get(); - // expected-warning@-1{{Local variable 'bar' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} RetainPtr<SomeObj> other(bar); // We don't detect other has the same value as guardian. guardian.swap(other); [bar doWork]; } { SomeObj *bar = guardian.get(); - // expected-warning@-1{{Local variable 'bar' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} RetainPtr<SomeObj> other(static_cast<RetainPtr<SomeObj>&&>(guardian)); [bar doWork]; } { SomeObj *bar = guardian.get(); - // expected-warning@-1{{Local variable 'bar' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} guardian.clear(); [bar doWork]; } { SomeObj *bar = guardian.get(); - // expected-warning@-1{{Local variable 'bar' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} guardian = [o other] ? o : bar; [bar doWork]; } @@ -196,7 +196,7 @@ void foo10() { } { CFMutableArrayRef arrayRef = array.get(); - // expected-warning@-1{{Local variable 'arrayRef' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'arrayRef' is a RetainPtr-capable type 'CFMutableArrayRef' [alpha.webkit.UnretainedLocalVarsChecker]}} array = nullptr; CFArrayAppendValue(arrayRef, nullptr); } @@ -216,7 +216,7 @@ void foo11() { } { dispatch_queue_t queuePtr = queue.get(); - // expected-warning@-1{{Local variable 'queuePtr' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'queuePtr' is a RetainPtr-capable type 'dispatch_queue_t' [alpha.webkit.UnretainedLocalVarsChecker]}} queue = nullptr; dispatch_queue_get_label(queuePtr); } @@ -239,24 +239,24 @@ void foo11() { void evil_func() { SomeObj *bar = provide_obj(); - // expected-warning@-1{{Local variable 'bar' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} auto *baz = provide_obj(); - // expected-warning@-1{{Local variable 'baz' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'baz' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} auto *baz2 = this->provide_obj(); - // expected-warning@-1{{Local variable 'baz2' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'baz2' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} [[clang::suppress]] auto *baz_suppressed = provide_obj(); // no-warning } void func() { SomeObj *bar = provide_obj(); - // expected-warning@-1{{Local variable 'bar' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} if (bar) [bar doWork]; } void bar() { auto bar = provide_cf_array(); - // expected-warning@-1{{Local variable 'bar' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'bar' is a raw pointer to RetainPtr-capable type '__CFArray' [alpha.webkit.UnretainedLocalVarsChecker]}} doWork(bar); [[clang::suppress]] auto baz = provide_cf_array(); // no-warning doWork(baz); @@ -264,7 +264,7 @@ void bar() { void baz() { auto value1 = provide_queue(); - // expected-warning@-1{{Local variable 'value1' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'value1' is a raw pointer to RetainPtr-capable type 'NSObject' [alpha.webkit.UnretainedLocalVarsChecker]}} doWork(value1); [[clang::suppress]] auto value2 = provide_queue(); // no-warning doWork(value2); @@ -305,7 +305,7 @@ void foo3() { void foo() { SomeObj *a = bar() ? nullptr : provide_obj(); - // expected-warning@-1{{Local variable 'a' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'a' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} RetainPtr<SomeObj> b = provide_obj(); { SomeObj* c = bar() ? nullptr : b.get(); @@ -323,14 +323,14 @@ void foo() { void foo(SomeObj* a) { SomeObj* b = a; - // expected-warning@-1{{Local variable 'b' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'b' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} if ([b other]) b = provide_obj(); } void bar(SomeObj* a) { SomeObj* b; - // expected-warning@-1{{Local variable 'b' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'b' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} b = provide_obj(); } @@ -338,7 +338,7 @@ void baz() { RetainPtr<SomeObj> a = provide_obj(); { SomeObj* b = a.get(); - // expected-warning@-1{{Local variable 'b' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'b' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} b = provide_obj(); } } @@ -352,7 +352,7 @@ void baz() { void foo(SomeObj* a) { a = provide_obj(); - // expected-warning@-1{{Assignment to an unretained parameter 'a' is unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Parameter 'a' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} someFunction(); [a doWork]; } @@ -362,7 +362,7 @@ void foo(SomeObj* a) { void bar(CFMutableArrayRef a) { a = provide_cf_array(); - // expected-warning@-1{{Assignment to an unretained parameter 'a' is unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Parameter 'a' is a RetainPtr-capable type 'CFMutableArrayRef' [alpha.webkit.UnretainedLocalVarsChecker]}} doWork(a); } @@ -371,7 +371,7 @@ void bar(CFMutableArrayRef a) { void baz(dispatch_queue_t a) { a = provide_queue(); - // expected-warning@-1{{Assignment to an unretained parameter 'a' is unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Parameter 'a' is a RetainPtr-capable type 'dispatch_queue_t' [alpha.webkit.UnretainedLocalVarsChecker]}} doWork(a); } @@ -384,7 +384,7 @@ void baz(dispatch_queue_t a) { void foo() { static SomeObj* a = nullptr; - // expected-warning@-1{{Static local variable 'a' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Static local variable 'a' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} a = provide_obj(); someFunction(); [a doWork]; @@ -395,7 +395,7 @@ void foo() { void bar() { static CFMutableArrayRef a = nullptr; - // expected-warning@-1{{Static local variable 'a' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Static local variable 'a' is a RetainPtr-capable type 'CFMutableArrayRef' [alpha.webkit.UnretainedLocalVarsChecker]}} a = provide_cf_array(); doWork(a); } @@ -405,7 +405,7 @@ void bar() { void baz() { static dispatch_queue_t a = nullptr; - // expected-warning@-1{{Static local variable 'a' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Static local variable 'a' is a RetainPtr-capable type 'dispatch_queue_t' [alpha.webkit.UnretainedLocalVarsChecker]}} a = provide_queue(); doWork(a); } @@ -418,7 +418,7 @@ void baz() { void someFunction(); SomeObj* g_a = nullptr; -// expected-warning@-1{{Global variable 'local_assignment_to_global::g_a' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} +// expected-warning@-1{{Global variable 'local_assignment_to_global::g_a' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} void foo() { g_a = provide_obj(); @@ -430,7 +430,7 @@ void foo() { void doWork(CFMutableArrayRef); CFMutableArrayRef g_b = nullptr; -// expected-warning@-1{{Global variable 'local_assignment_to_global::g_b' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} +// expected-warning@-1{{Global variable 'local_assignment_to_global::g_b' is a RetainPtr-capable type 'CFMutableArrayRef' [alpha.webkit.UnretainedLocalVarsChecker]}} void bar() { g_b = provide_cf_array(); @@ -440,7 +440,7 @@ void bar() { dispatch_queue_t provide_queue(); void doWork(dispatch_queue_t); dispatch_queue_t g_c = nullptr; -// expected-warning@-1{{Global variable 'local_assignment_to_global::g_c' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} +// expected-warning@-1{{Global variable 'local_assignment_to_global::g_c' is a RetainPtr-capable type 'dispatch_queue_t' [alpha.webkit.UnretainedLocalVarsChecker]}} void baz() { g_c = provide_queue(); @@ -510,11 +510,11 @@ void use_const_global() { dispatch_queue_t provide_queue(); void use_const_local() { NSString * const str = provide_str(); - // expected-warning@-1{{Local variable 'str' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'str' is a raw pointer to RetainPtr-capable type 'NSString' [alpha.webkit.UnretainedLocalVarsChecker]}} CFDictionaryRef dict = provide_dict(); - // expected-warning@-1{{Local variable 'dict' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'dict' is a RetainPtr-capable type 'CFDictionaryRef' [alpha.webkit.UnretainedLocalVarsChecker]}} dispatch_queue_t queue = provide_queue(); - // expected-warning@-1{{Local variable 'queue' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'queue' is a RetainPtr-capable type 'dispatch_queue_t' [alpha.webkit.UnretainedLocalVarsChecker]}} doWork(str, dict, queue); } @@ -559,7 +559,7 @@ void cf() { auto *str = kCFURLTagNamesKey; consumeCFString(str); auto *localStr = LocalGlobalCFString; - // expected-warning@-1{{Local variable 'localStr' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'localStr' is a raw pointer to RetainPtr-capable type '__CFString' [alpha.webkit.UnretainedLocalVarsChecker]}} consumeCFString(localStr); } @@ -567,7 +567,7 @@ void ns() { auto *str = NSApplicationDidBecomeActiveNotification; consumeNSString(str); auto *localStr = LocalGlobalNSString; - // expected-warning@-1{{Local variable 'localStr' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'localStr' is a raw pointer to RetainPtr-capable type 'NSString' [alpha.webkit.UnretainedLocalVarsChecker]}} consumeNSString(localStr); } @@ -592,7 +592,7 @@ - (SomeObj*)getSomeObj { - (void)storeSomeObj { auto *obj = [self getSomeObj]; - // expected-warning@-1{{Local variable 'obj' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'obj' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} [obj doWork]; auto *obj2 = [SomeObj sharedInstance]; [obj2 doWork]; @@ -600,7 +600,7 @@ - (void)storeSomeObj { - (void)assignToGuardianArg:(RetainPtr<SomeObj>&)obj { SomeObj* ptr = obj.get(); - // expected-warning@-1{{Local variable 'ptr' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}} + // expected-warning@-1{{Local variable 'ptr' is a raw pointer to RetainPtr-capable type 'SomeObj' [alpha.webkit.UnretainedLocalVarsChecker]}} obj = nullptr; [ptr doWork]; } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
