diff options
author | Ryosuke Niwa <rniwa@webkit.org> | 2025-06-09 07:32:15 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-06-09 07:32:15 -0700 |
commit | e5fa38b02bb7c769347a90b94a76aa0accc1e819 (patch) | |
tree | 831d5715fb6189adc54ad4b261a797133cb54537 /clang/lib/StaticAnalyzer | |
parent | 64bd4d91efb2de5380c9e61ff75c970293a11886 (diff) | |
download | llvm-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')
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"; } }; |