• Home
  • Raw
  • Download

Lines Matching +full:check +full:- +full:direct

1 //=- DirectIvarAssignment.cpp - Check rules on ObjC properties -*- C++ ----*-==//
8 //===----------------------------------------------------------------------===//
10 // Check that Objective C properties are set with the setter, not though a
11 // direct assignment.
22 //===----------------------------------------------------------------------===//
39 /// the check should not be performed.
42 /// to perform direct instance variable assignment based on their name.
44 return M->getMethodFamily() == OMF_init || in DefaultMethodFilter()
45 M->getMethodFamily() == OMF_dealloc || in DefaultMethodFilter()
46 M->getMethodFamily() == OMF_copy || in DefaultMethodFilter()
47 M->getMethodFamily() == OMF_mutableCopy || in DefaultMethodFilter()
48 M->getSelector().getNameForSlot(0).find("init") != StringRef::npos || in DefaultMethodFilter()
49 M->getSelector().getNameForSlot(0).find("Init") != StringRef::npos; in DefaultMethodFilter()
53 public Checker<check::ASTDecl<ObjCImplementationDecl> > {
80 for (const Stmt *Child : S->children()) in VisitChildren()
82 this->Visit(Child); in VisitChildren()
98 // Check for synthesized ivars. in findPropertyBackingIvar()
99 ObjCIvarDecl *ID = PD->getPropertyIvarDecl(); in findPropertyBackingIvar()
105 // Check for existing "_PropName". in findPropertyBackingIvar()
106 ID = NonConstInterD->lookupInstanceVariable(PD->getDefaultSynthIvarName(Ctx)); in findPropertyBackingIvar()
110 // Check for existing "PropName". in findPropertyBackingIvar()
111 IdentifierInfo *PropIdent = PD->getIdentifier(); in findPropertyBackingIvar()
112 ID = NonConstInterD->lookupInstanceVariable(PropIdent); in findPropertyBackingIvar()
120 const ObjCInterfaceDecl *InterD = D->getClassInterface(); in checkASTDecl()
126 for (const auto *PD : InterD->instance_properties()) { in checkASTDecl()
141 for (const auto *M : D->instance_methods()) { in checkASTDecl()
147 const Stmt *Body = M->getBody(); in checkASTDecl()
150 MethodCrawler MC(IvarToPropMap, M->getCanonicalDecl(), InterD, BR, this, in checkASTDecl()
157 for (const auto *Ann : D->specific_attrs<AnnotateAttr>()) in isAnnotatedToAllowDirectAssignment()
158 if (Ann->getAnnotation() == in isAnnotatedToAllowDirectAssignment()
166 if (!BO->isAssignmentOp()) in VisitBinaryOperator()
170 dyn_cast<ObjCIvarRefExpr>(BO->getLHS()->IgnoreParenCasts()); in VisitBinaryOperator()
175 if (const ObjCIvarDecl *D = IvarRef->getDecl()) { in VisitBinaryOperator()
179 const ObjCPropertyDecl *PD = I->second; in VisitBinaryOperator()
189 InterfD->getInstanceMethod(PD->getGetterName()); in VisitBinaryOperator()
191 InterfD->getInstanceMethod(PD->getSetterName()); in VisitBinaryOperator()
193 if (SetterMethod && SetterMethod->getCanonicalDecl() == MD) in VisitBinaryOperator()
196 if (GetterMethod && GetterMethod->getCanonicalDecl() == MD) in VisitBinaryOperator()
201 "Direct assignment to an instance variable backing a property; " in VisitBinaryOperator()
209 // Register the checker that checks for direct accesses in all functions,
215 // Register the checker that checks for direct accesses in functions annotated
218 for (const auto *Ann : M->specific_attrs<AnnotateAttr>()) in AttrFilter()
219 if (Ann->getAnnotation() == "objc_no_direct_instance_variable_assignment") in AttrFilter()
226 mgr.registerChecker<DirectIvarAssignment>()->ShouldSkipMethod = &AttrFilter; in registerDirectIvarAssignmentForAnnotatedFunctions()