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

Reply via email to