[clang] [WebKit Checkers] Treat const Objective-C ivar as a safe origin (PR #126353)
Ryosuke Niwa via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 7 23:23:28 PST 2025
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 <rniwa at 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"
- at interface Foo : NSObject
+ at 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
More information about the cfe-commits
mailing list