https://github.com/rniwa created https://github.com/llvm/llvm-project/pull/126353
Like const C++ member variables, treat const Ref, RefPtr, CheckedRef, CheckedPtr Objective-C ivars as a safe pointer origin in WebKit checkers. >From b3d79dd62e88afa0e83101165ea878f12176e0f2 Mon Sep 17 00:00:00 2001 From: Ryosuke Niwa <rn...@webkit.org> Date: Fri, 7 Feb 2025 23:21:06 -0800 Subject: [PATCH] [WebKit Checkers] Treat const Objective-C ivar as a safe origin Like const C++ member variables, treat const Ref, RefPtr, CheckedRef, CheckedPtr Objective-C ivars as a safe pointer origin in WebKit checkers. --- clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp | 9 ++++++--- clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.mm | 9 ++++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp index abf5d3ec193a41a..029ca0d2385232d 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp @@ -163,10 +163,13 @@ bool isConstOwnerPtrMemberExpr(const clang::Expr *E) { if (OCE->getOperator() == OO_Star && OCE->getNumArgs() == 1) E = OCE->getArg(0); } - auto *ME = dyn_cast<MemberExpr>(E); - if (!ME) + const ValueDecl *D = nullptr; + if (auto *ME = dyn_cast<MemberExpr>(E)) + D = ME->getMemberDecl(); + else if (auto *IVR = dyn_cast<ObjCIvarRefExpr>(E)) + D = IVR->getDecl(); + else return false; - auto *D = ME->getMemberDecl(); if (!D) return false; auto T = D->getType(); diff --git a/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.mm b/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.mm index 9ad1880e9d11883..ccac2e6439444ae 100644 --- a/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.mm +++ b/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.mm @@ -5,7 +5,10 @@ #import "mock-system-header.h" #import "../../Inputs/system-header-simulator-for-objc-dealloc.h" -@interface Foo : NSObject +@interface Foo : NSObject { + const Ref<RefCountable> _obj1; + const RefPtr<RefCountable> _obj2; +} @property (nonatomic, readonly) RefPtr<RefCountable> countable; @@ -17,6 +20,9 @@ @implementation Foo - (void)execute { self._protectedRefCountable->method(); + _obj1->method(); + _obj1.get().method(); + (*_obj2).method(); } - (RefPtr<RefCountable>)_protectedRefCountable { @@ -30,6 +36,7 @@ - (void)execute { void ref() const; void deref() const; Ref<RefCountedObject> copy() const; + void method(); }; @interface WrapperObj : NSObject _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits