[clang] 3c50f25 - [analyzer] Fix more ObjC accessor body farms after 2073dd2d.
Artem Dergachev via cfe-commits
cfe-commits at lists.llvm.org
Wed Dec 4 16:29:46 PST 2019
Author: Artem Dergachev
Date: 2019-12-04T16:29:08-08:00
New Revision: 3c50f2544f7a8f0c41f4fc286064abce2d3629b5
URL: https://github.com/llvm/llvm-project/commit/3c50f2544f7a8f0c41f4fc286064abce2d3629b5
DIFF: https://github.com/llvm/llvm-project/commit/3c50f2544f7a8f0c41f4fc286064abce2d3629b5.diff
LOG: [analyzer] Fix more ObjC accessor body farms after 2073dd2d.
Fix a crash when constructing a body farm for accessors of a property
that is declared and @synthesize'd in different (but related) interfaces
with the explicit ivar syntax.
This is a follow-up for 0b58b80e.
Added:
Modified:
clang/lib/Analysis/BodyFarm.cpp
clang/test/Analysis/properties.m
Removed:
################################################################################
diff --git a/clang/lib/Analysis/BodyFarm.cpp b/clang/lib/Analysis/BodyFarm.cpp
index 694913b3ac93..1a7891550542 100644
--- a/clang/lib/Analysis/BodyFarm.cpp
+++ b/clang/lib/Analysis/BodyFarm.cpp
@@ -741,13 +741,17 @@ static Stmt *createObjCPropertyGetter(ASTContext &Ctx,
// First, find the backing ivar.
const ObjCIvarDecl *IVar = nullptr;
- // Property accessor stubs sometimes do not correspond to any property.
+ // Property accessor stubs sometimes do not correspond to any property decl
+ // in the current interface (but in a superclass). They still have a
+ // corresponding property impl decl in this case.
if (MD->isSynthesizedAccessorStub()) {
const ObjCInterfaceDecl *IntD = MD->getClassInterface();
const ObjCImplementationDecl *ImpD = IntD->getImplementation();
- for (const auto *V: ImpD->ivars()) {
- if (V->getName() == MD->getSelector().getNameForSlot(0))
- IVar = V;
+ for (const auto *PI: ImpD->property_impls()) {
+ if (const ObjCPropertyDecl *P = PI->getPropertyDecl()) {
+ if (P->getGetterName() == MD->getSelector())
+ IVar = P->getPropertyIvarDecl();
+ }
}
}
diff --git a/clang/test/Analysis/properties.m b/clang/test/Analysis/properties.m
index 2f427f275182..d83b8ed14f93 100644
--- a/clang/test/Analysis/properties.m
+++ b/clang/test/Analysis/properties.m
@@ -1049,6 +1049,8 @@ - (NSObject *)getShadowedIvar;
- (void)clearShadowedIvar;
- (NSObject *)getShadowedProp;
- (void)clearShadowedProp;
+
+ at property (assign) NSObject *o2;
@end
@implementation Shadowed
@@ -1078,7 +1080,7 @@ @implementation Shadowing
@synthesize o;
-(void)testPropertyShadowing {
- NSObject *oo = self.o;
+ NSObject *oo = self.o; // no-crash
clang_analyzer_eval(self.o == oo); // expected-warning{{TRUE}}
clang_analyzer_eval([self getShadowedIvar] == oo); // expected-warning{{UNKNOWN}}
[self clearShadowedIvar];
@@ -1086,4 +1088,10 @@ -(void)testPropertyShadowing {
clang_analyzer_eval([self getShadowedIvar] == oo); // expected-warning{{UNKNOWN}}
clang_analyzer_eval([self getShadowedIvar] == nil); // expected-warning{{TRUE}}
}
+
+ at synthesize o2 = ooo2;
+
+-(void)testPropertyShadowingWithExplicitIvar {
+ NSObject *oo2 = self.o2; // no-crash
+}
@end
More information about the cfe-commits
mailing list