[cfe-commits] r164803 - in /cfe/trunk: lib/StaticAnalyzer/Checkers/DirectIvarAssignment.cpp test/Analysis/objc-properties.m
Anna Zaks
ganna at apple.com
Thu Sep 27 14:57:18 PDT 2012
Author: zaks
Date: Thu Sep 27 16:57:17 2012
New Revision: 164803
URL: http://llvm.org/viewvc/llvm-project?rev=164803&view=rev
Log:
[analyzer] Address Jordan's code review for r164790.
Modified:
cfe/trunk/lib/StaticAnalyzer/Checkers/DirectIvarAssignment.cpp
cfe/trunk/test/Analysis/objc-properties.m
Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/DirectIvarAssignment.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/DirectIvarAssignment.cpp?rev=164803&r1=164802&r2=164803&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Checkers/DirectIvarAssignment.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Checkers/DirectIvarAssignment.cpp Thu Sep 27 16:57:17 2012
@@ -64,21 +64,23 @@
};
static const ObjCIvarDecl *findPropertyBackingIvar(const ObjCPropertyDecl *PD,
- ObjCInterfaceDecl *InterD,
- ASTContext &Ctx) {
+ const ObjCInterfaceDecl *InterD,
+ ASTContext &Ctx) {
// Check for synthesized ivars.
ObjCIvarDecl *ID = PD->getPropertyIvarDecl();
if (ID)
return ID;
+ ObjCInterfaceDecl *NonConstInterD = const_cast<ObjCInterfaceDecl*>(InterD);
+
// Check for existing "_PropName".
- ID = InterD->lookupInstanceVariable(PD->getDefaultSynthIvarName(Ctx));
+ ID = NonConstInterD->lookupInstanceVariable(PD->getDefaultSynthIvarName(Ctx));
if (ID)
return ID;
// Check for existing "PropName".
IdentifierInfo *PropIdent = PD->getIdentifier();
- ID = InterD->lookupInstanceVariable(PropIdent);
+ ID = NonConstInterD->lookupInstanceVariable(PropIdent);
return ID;
}
@@ -97,9 +99,8 @@
ObjCPropertyDecl *PD = *I;
// Find the corresponding IVar.
- const ObjCIvarDecl *ID = findPropertyBackingIvar(PD,
- const_cast<ObjCInterfaceDecl*>(InterD),
- Mgr.getASTContext());
+ const ObjCIvarDecl *ID = findPropertyBackingIvar(PD, InterD,
+ Mgr.getASTContext());
if (!ID)
continue;
@@ -117,15 +118,16 @@
ObjCMethodDecl *M = *I;
AnalysisDeclContext *DCtx = Mgr.getAnalysisDeclContext(M);
+ // Skip the init, dealloc functions and any functions that might be doing
+ // initialization based on their name.
if (M->getMethodFamily() == OMF_init ||
M->getMethodFamily() == OMF_dealloc ||
- M->getSelector().getAsString().find("init") != StringRef::npos ||
- M->getSelector().getAsString().find("Init") != StringRef::npos)
+ M->getSelector().getNameForSlot(0).find("init") != StringRef::npos ||
+ M->getSelector().getNameForSlot(0).find("Init") != StringRef::npos)
continue;
const Stmt *Body = M->getBody();
- if (!Body)
- continue;
+ assert(Body);
MethodCrawler MC(IvarToPropMap, M->getCanonicalDecl(), InterD, BR, DCtx);
MC.VisitStmt(Body);
@@ -137,7 +139,8 @@
if (!BO->isAssignmentOp())
return;
- const ObjCIvarRefExpr *IvarRef = dyn_cast<ObjCIvarRefExpr>(BO->getLHS());
+ const ObjCIvarRefExpr *IvarRef =
+ dyn_cast<ObjCIvarRefExpr>(BO->getLHS()->IgnoreParenCasts());
if (!IvarRef)
return;
@@ -158,16 +161,13 @@
if (GetterMethod && GetterMethod->getCanonicalDecl() == MD)
return;
-
- PathDiagnosticLocation IvarRefLocation =
- PathDiagnosticLocation::createBegin(IvarRef,
- BR.getSourceManager(), DCtx);
-
BR.EmitBasicReport(MD,
"Property access",
categories::CoreFoundationObjectiveC,
"Direct assignment to an instance variable backing a property; "
- "use the setter instead", IvarRefLocation);
+ "use the setter instead", PathDiagnosticLocation(IvarRef,
+ BR.getSourceManager(),
+ DCtx));
}
}
}
Modified: cfe/trunk/test/Analysis/objc-properties.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/objc-properties.m?rev=164803&r1=164802&r2=164803&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/objc-properties.m (original)
+++ cfe/trunk/test/Analysis/objc-properties.m Thu Sep 27 16:57:17 2012
@@ -13,7 +13,7 @@
@property (assign, nonatomic) MyClass* Y; // automatically synthesized, implemented
- @property (assign, nonatomic) MyClass* Z; // non synthesized, implemented
+ @property (assign, nonatomic) MyClass* Z; // non synthesized ivar, implemented setter
@property (readonly) id nonSynth; // non synthesized, explicitly implemented to return ivar with expected name
- (id) initWithPtr:(MyClass*) value;
@@ -47,7 +47,7 @@
}
- (void) someMethod: (MyClass*)In {
- __A = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}}
+ (__A) = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}}
_X = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}}
_Y = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}}
_Z = In; // expected-warning {{Direct assignment to an instance variable backing a property; use the setter instead}}
More information about the cfe-commits
mailing list