[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