llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang @llvm/pr-subscribers-clang-static-analyzer-1 Author: Ryosuke Niwa (rniwa) <details> <summary>Changes</summary> This PR fixes a bug in alpha.webkit.UncountedLocalVarsChecker that it wasn't allowing a guardian variable's getter to be called when initializing a raw pointer/reference. Also fix a bug that operator* wasn't recognized as a valid getter on a smart pointer. --- Full diff: https://github.com/llvm/llvm-project/pull/219647.diff 4 Files Affected: - (modified) clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp (+5-2) - (modified) clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp (+5) - (modified) clang/test/Analysis/Checkers/WebKit/mock-types.h (+2-1) - (modified) clang/test/Analysis/Checkers/WebKit/uncounted-local-vars.cpp (+18-1) ``````````diff diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp index e8e404c753dcb..eb5960c262c95 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp @@ -357,10 +357,13 @@ std::optional<bool> isGetterOfSafePtr(const CXXMethodDecl *M) { std::string className = safeGetName(calleeMethodsClass); std::string method = safeGetName(M); - if (isCheckedPtr(className) && (method == "get" || method == "ptr")) + auto OpType = M->getOverloadedOperator(); + if (isCheckedPtr(className) && + (method == "get" || method == "ptr" || OpType == OO_Star)) return true; - if ((isRefType(className) && (method == "get" || method == "ptr")) || + if ((isRefType(className) && + (method == "get" || method == "ptr" || OpType == OO_Star)) || ((className == "String" || className == "AtomString" || className == "AtomStringImpl" || className == "UniqueString" || className == "UniqueStringImpl" || className == "Identifier") && diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp index b420ce73ae82e..f3c620436f7a4 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp @@ -89,6 +89,11 @@ struct GuardianVisitor : DynamicRecursiveASTVisitor { return false; if (isPtrConversion(Callee)) return true; + if (auto *Method = dyn_cast<CXXMethodDecl>(Callee)) { + auto IsGetter = isGetterOfSafePtr(Method); + if (IsGetter && *IsGetter) + return true; + } unsigned ArgIndex = 0; unsigned ArgOffset = isa<CXXOperatorCallExpr>(CE); for (auto *Arg : CE->arguments()) { diff --git a/clang/test/Analysis/Checkers/WebKit/mock-types.h b/clang/test/Analysis/Checkers/WebKit/mock-types.h index 87b495f526f27..dea16f534ba2b 100644 --- a/clang/test/Analysis/Checkers/WebKit/mock-types.h +++ b/clang/test/Analysis/Checkers/WebKit/mock-types.h @@ -435,7 +435,8 @@ struct RefCountable { unsigned m_refCount { 0 }; }; -template <typename T> T *downcast(T *t) { return t; } +template <typename U, typename T> U [[clang::annotate_type("webkit.pointerconversion")]] *downcast(T *t) { return static_cast<U*>(t); } +template <typename U, typename T> U [[clang::annotate_type("webkit.pointerconversion")]] &downcast(T &t) { return static_cast<U&>(t); } template <typename T> struct CheckedRef { private: diff --git a/clang/test/Analysis/Checkers/WebKit/uncounted-local-vars.cpp b/clang/test/Analysis/Checkers/WebKit/uncounted-local-vars.cpp index d36e78f12453f..31990217525c1 100644 --- a/clang/test/Analysis/Checkers/WebKit/uncounted-local-vars.cpp +++ b/clang/test/Analysis/Checkers/WebKit/uncounted-local-vars.cpp @@ -214,6 +214,23 @@ void foo9(RefCountable& o) { } } +RefCountable* provide(); + +struct Derived : public RefCountable { +}; + +void foo10() { + RefPtr<RefCountable> obj = provide(); + if (obj) { + auto* ptr = downcast<Derived>(obj.get()); + ptr->method(); + } + if (obj) { + auto& ref = downcast<Derived>(*obj); + ref.method(); + } +} + } // namespace guardian_scopes namespace auto_keyword { @@ -705,4 +722,4 @@ namespace binding_raw_ptr { a->method(); } -} \ No newline at end of file +} `````````` </details> https://github.com/llvm/llvm-project/pull/219647 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
