aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/StaticAnalyzer
diff options
context:
space:
mode:
authorRyosuke Niwa <rniwa@webkit.org>2025-06-09 07:32:15 -0700
committerGitHub <noreply@github.com>2025-06-09 07:32:15 -0700
commite5fa38b02bb7c769347a90b94a76aa0accc1e819 (patch)
tree831d5715fb6189adc54ad4b261a797133cb54537 /clang/lib/StaticAnalyzer
parent64bd4d91efb2de5380c9e61ff75c970293a11886 (diff)
downloadllvm-e5fa38b02bb7c769347a90b94a76aa0accc1e819.zip
llvm-e5fa38b02bb7c769347a90b94a76aa0accc1e819.tar.gz
llvm-e5fa38b02bb7c769347a90b94a76aa0accc1e819.tar.bz2
[WebKit checkers] Treat passing of a member variable which is capable of CheckedPtr as safe. (#142485)
It's safe for a member function of a class or struct to call a function or allocate a local variable with a pointer or a reference to a member variable since "this" pointer, and therefore all its members, will be kept alive by its caller so recognize as such.
Diffstat (limited to 'clang/lib/StaticAnalyzer')
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp20
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.h4
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefCallArgsChecker.cpp4
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp3
4 files changed, 31 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp
index 81fca5d..cfcc47c 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp
@@ -236,6 +236,26 @@ bool isConstOwnerPtrMemberExpr(const clang::Expr *E) {
return isOwnerPtrType(T) && T.isConstQualified();
}
+bool isExprToGetCheckedPtrCapableMember(const clang::Expr *E) {
+ auto *ME = dyn_cast<MemberExpr>(E);
+ if (!ME)
+ return false;
+ auto *Base = ME->getBase();
+ if (!Base)
+ return false;
+ if (!isa<CXXThisExpr>(Base->IgnoreParenCasts()))
+ return false;
+ auto *D = ME->getMemberDecl();
+ if (!D)
+ return false;
+ auto T = D->getType();
+ auto *CXXRD = T->getAsCXXRecordDecl();
+ if (!CXXRD)
+ return false;
+ auto result = isCheckedPtrCapable(CXXRD);
+ return result && *result;
+}
+
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 e2cc7b9..8302bbe 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.h
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.h
@@ -69,6 +69,10 @@ bool isASafeCallArg(const clang::Expr *E);
/// \returns true if E is a MemberExpr accessing a const smart pointer type.
bool isConstOwnerPtrMemberExpr(const clang::Expr *E);
+/// \returns true if E is a MemberExpr accessing a member variable which
+/// supports CheckedPtr.
+bool isExprToGetCheckedPtrCapableMember(const clang::Expr *E);
+
/// \returns true if E is a CXXMemberCallExpr which returns a const smart
/// pointer type.
class EnsureFunctionAnalysis {
diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefCallArgsChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefCallArgsChecker.cpp
index 78675e5..6bc39ab 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefCallArgsChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefCallArgsChecker.cpp
@@ -443,6 +443,10 @@ public:
return isRefOrCheckedPtrType(type);
}
+ bool isSafeExpr(const Expr *E) const final {
+ return isExprToGetCheckedPtrCapableMember(E);
+ }
+
const char *ptrKind() const final { return "unchecked"; }
};
diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp
index 4fb4770..7cd86a6 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp
@@ -417,6 +417,9 @@ public:
bool isSafePtrType(const QualType type) const final {
return isRefOrCheckedPtrType(type);
}
+ bool isSafeExpr(const Expr *E) const final {
+ return isExprToGetCheckedPtrCapableMember(E);
+ }
const char *ptrKind() const final { return "unchecked"; }
};