Lines Matching +full:fine +full:- +full:tuning

1 //==-- RetainCountChecker.cpp - Checks for leaks and other issues -*- C++ -*--//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
12 //===----------------------------------------------------------------------===//
30 return State->get<RefBindings>(Sym); in getRefBinding()
40 return State->set<RefBindings>(Sym, Val); in setRefBinding()
44 return State->remove<RefBindings>(Sym); in removeRefBinding()
86 Out << "-dealloc (not-owned)"; in print()
98 Out << "Use-After-Release [ERROR]"; in print()
102 Out << "Release of Not-Owned [ERROR]"; in print()
106 Out << "Over-autoreleased"; in print()
110 Out << "Non-owned object returned instead of owned"; in print()
125 Out << " [autorelease -" << ACnt << ']'; in print()
143 //===----------------------------------------------------------------------===//
145 //===----------------------------------------------------------------------===//
152 if (!BE->getBlockDecl()->hasCaptures()) in checkPostStmt()
158 BlockDataRegion::referenced_vars_iterator I = R->referenced_vars_begin(), in checkPostStmt()
159 E = R->referenced_vars_end(); in checkPostStmt()
173 if (VR->getSuperRegion() == R) { in checkPostStmt()
174 VR = MemMgr.getVarRegion(VR->getDecl(), LC); in checkPostStmt()
179 state = state->scanReachableSymbols<StopTrackingCallback>(Regions).getState(); in checkPostStmt()
189 QualType QT = CE->getType(); in checkPostStmt()
191 if (QT->isObjCObjectPointerType()) { in checkPostStmt()
199 switch (BE->getBridgeKind()) { in checkPostStmt()
234 for (const Stmt *Child : Ex->children()) { in processObjCLiterals()
235 SVal V = pred->getSVal(Child); in processObjCLiterals()
242 processNonLeakError(state, Child->getSourceRange(), hasErr, sym, C); in processObjCLiterals()
251 state->getSVal(Ex, pred->getLocationContext()).getAsSymbol()) { in processObjCLiterals()
252 QualType ResultTy = Ex->getType(); in processObjCLiterals()
275 ProgramStateRef State = Pred->getState(); in checkPostStmt()
277 if (SymbolRef Sym = Pred->getSVal(Ex).getAsSymbol()) { in checkPostStmt()
278 QualType ResultTy = Ex->getType(); in checkPostStmt()
293 SymbolRef Sym = State->getSVal(*IVarLoc).getAsSymbol(); in checkPostStmt()
294 if (!Sym || !isa_and_nonnull<ObjCIvarRegion>(Sym->getOriginRegion())) in checkPostStmt()
300 QualType Ty = Sym->getType(); in checkPostStmt()
302 if (Ty->isObjCRetainableType()) in checkPostStmt()
310 ConstraintManager &CMgr = State->getConstraintManager(); in checkPostStmt()
317 if (RV->getIvarAccessHistory() != RefVal::IvarAccessHistory::None || in checkPostStmt()
323 C.addTransition(setRefBinding(State, Sym, RV->withIvarAccess())); in checkPostStmt()
344 return MC->getMethodFamily() == OMF_init && MC->isReceiverSelfOrSuper() && in isReceiverUnconsumedSelf()
346 ->getAnalysisDeclContext() in isReceiverUnconsumedSelf()
347 ->getParentMap() in isReceiverUnconsumedSelf()
371 if (MC->isInstanceMessage()) { in checkPostCall()
372 SVal ReceiverV = MC->getReceiverSVal(); in checkPostCall()
375 ReceiverType = T->getType(); in checkPostCall()
388 /// GetReturnType - Used to get the return type of a message expression or
396 QualType RetTy = RetE->getType(); in GetReturnType()
401 if (const ObjCObjectPointerType *PT = RetTy->getAs<ObjCObjectPointerType>()) in GetReturnType()
402 if (PT->isObjCQualifiedIdType() || PT->isObjCIdType() || in GetReturnType()
403 PT->isObjCClassType()) { in GetReturnType()
408 const ObjCInterfaceDecl *D = ME->getReceiverInterface(); in GetReturnType()
428 QualType PT = QT->getPointeeType(); in isPointerToObject()
430 if (PT->getAsCXXRecordDecl()) in isPointerToObject()
439 if (TrackedValue->getObjKind() != ObjKind::OS) in shouldEscapeOSArgumentOnCall()
443 return !isPointerToObject(CE.parameters()[ArgIdx]->getType()); in shouldEscapeOSArgumentOnCall()
471 if (SymbolRef Sym = MsgInvocation->getReceiverSVal().getAsLocSymbol()) { in processSummaryOfInlined()
491 cast<SubRegion>(MR)->getSuperRegion()); in isSmartPtrField()
492 return TR && RetainSummaryManager::isKnownSmartPointer(TR->getValueType()); in isSmartPtrField()
498 /// - binding to something that is not a memory region.
499 /// - binding to a memregion that does not have stack storage
500 /// - binding to a variable that has a destructor attached using CleanupAttr
512 if (!R->hasStackStorage() || !VR) in shouldEscapeRegion()
515 const VarDecl *VD = VR->getDecl(); in shouldEscapeRegion()
516 if (!VD->hasAttr<CleanupAttr>()) in shouldEscapeRegion()
541 if (!CE.getResultType()->isScalarType()) { in updateOutParameters()
547 AssumeNonZeroReturn = AssumeNonZeroReturn->assume(*DL, true); in updateOutParameters()
548 AssumeZeroReturn = AssumeZeroReturn->assume(*DL, false); in updateOutParameters()
560 QualType PointeeTy = ArgRegion->getValueType(); in updateOutParameters()
561 SVal PointeeVal = State->getSVal(ArgRegion); in updateOutParameters()
646 if (SymbolRef Sym = MsgInvocation->getReceiverSVal().getAsLocSymbol()) { in checkSummary()
652 ErrorRange = MsgInvocation->getOriginExpr()->getReceiverRange(); in checkSummary()
660 if (SymbolRef Sym = MCall->getCXXThisVal().getAsLocSymbol()) { in checkSummary()
665 ErrorRange = MCall->getOriginExpr()->getSourceRange(); in checkSummary()
734 // Handle all use-after-releases. in updateSymbol()
746 llvm_unreachable("Applies to pointer-to-pointer parameters, which should " in updateSymbol()
749 case Dealloc: // NB. we only need to add a note in a non-error case. in updateSymbol()
817 V = V - 1; in updateSymbol()
824 V = V - 1; in updateSymbol()
852 if (Sym->getType()->getPointeeCXXRecordDecl()) in errorKindToBugKind()
865 // HACK: Ignore retain-count issues on values accessed through ivars, in processNonLeakError()
872 if (RV->getIvarAccessHistory() != RefVal::IvarAccessHistory::None) in processNonLeakError()
882 report->addRange(ErrorRange); in processNonLeakError()
886 //===----------------------------------------------------------------------===//
887 // Handle the return values of retain-count-related functions.
888 //===----------------------------------------------------------------------===//
925 ? cast<CXXMemberCallExpr>(CE)->getImplicitObjectArgument() in evalCall()
926 : CE->getArg(0); in evalCall()
927 SVal RetVal = state->getSVal(BindReturnTo, LCtx); in evalCall()
941 state = state->BindExpr(CE, LCtx, RetVal, /*Invalidate=*/false); in evalCall()
948 NullOutputState = NullOutputState->BindExpr( in evalCall()
954 // output are non-zero. in evalCall()
956 state = state->assume(*L, /*assumption=*/true); in evalCall()
969 // Only adjust the reference count if this is the top-level call frame, in processReturn()
980 const Expr *RetE = S->getRetValue(); in processReturn()
987 SymbolRef Sym = state->getSValAsScalarOrLoc(RetE, C.getLocationContext()) in processReturn()
1004 X.setCount(cnt - 1); in processReturn()
1012 X.setCount(cnt - 1); in processReturn()
1030 // been over- or under-retained. in processReturn()
1051 const Decl *CD = &Pred->getCodeDecl(); in processReturn()
1057 RE = Summ->getRetEffect(); in processReturn()
1061 RE = Summ->getRetEffect(); in processReturn()
1074 // HACK: Ignore retain-count issues on values accessed through ivars, in checkReturnWithRetEffect()
1135 //===----------------------------------------------------------------------===//
1137 //===----------------------------------------------------------------------===//
1147 state = state->scanReachableSymbols<StopTrackingCallback>(val).getState(); in checkBind()
1161 RefBindingsTy B = state->get<RefBindings>(); in evalAssume()
1167 RefBindingsTy::Factory &RefBFactory = state->get_context<RefBindings>(); in evalAssume()
1168 ConstraintManager &CMgr = state->getConstraintManager(); in evalAssume()
1180 state = state->set<RefBindings>(B); in evalAssume()
1196 if (const SymbolicRegion *SR = I->StripCasts()->getAs<SymbolicRegion>()) in checkRegionChanges()
1197 AllowedSymbols.insert(SR->getSymbol()); in checkRegionChanges()
1202 // Remove any existing reference-count binding. in checkRegionChanges()
1229 // If we would over-release here, but we know the value came from an ivar, in handleAutoreleaseCounts()
1234 --ACnt; in handleAutoreleaseCounts()
1246 V.setCount(V.getCount() - ACnt); in handleAutoreleaseCounts()
1252 // HACK: Ignore retain-count issues on values accessed through ivars, in handleAutoreleaseCounts()
1292 // HACK: Ignore retain-count issues on values accessed through ivars, in handleSymbolDeath()
1339 const Decl *D = LCtx->getDecl(); in checkBeginFunction()
1347 ArgEffects CalleeSideArgEffects = FunctionSummary->getArgEffects(); in checkBeginFunction()
1349 for (unsigned idx = 0, e = C->param_size(); idx != e; ++idx) { in checkBeginFunction()
1350 const ParmVarDecl *Param = C->parameters()[idx]; in checkBeginFunction()
1351 SymbolRef Sym = state->getSVal(state->getRegion(Param, LCtx)).getAsSymbol(); in checkBeginFunction()
1353 QualType Ty = Param->getType(); in checkBeginFunction()
1356 ObjKind K = AE->getObjKind(); in checkBeginFunction()
1359 RefVal NewVal = AE->getKind() == DecRef ? RefVal::makeOwned(K, Ty) in checkBeginFunction()
1378 ProgramStateRef state = Pred->getState(); in checkEndFunction()
1379 RefBindingsTy B = state->get<RefBindings>(); in checkEndFunction()
1382 const LocationContext *LCtx = Pred->getLocationContext(); in checkEndFunction()
1383 if (LCtx->getAnalysisDeclContext()->isBodyAutosynthesized()) { in checkEndFunction()
1384 assert(!LCtx->inTopFrame()); in checkEndFunction()
1399 if (LCtx->getParent()) in checkEndFunction()
1402 B = state->get<RefBindings>(); in checkEndFunction()
1419 for (const auto &I: state->get<RefBindings>()) { in checkDeadSymbols()
1447 RefBindingsTy::Factory &F = state->get_context<RefBindings>(); in checkDeadSymbols()
1448 RefBindingsTy B = state->get<RefBindings>(); in checkDeadSymbols()
1453 state = state->set<RefBindings>(B); in checkDeadSymbols()
1460 RefBindingsTy B = State->get<RefBindings>(); in printState()
1474 //===----------------------------------------------------------------------===//
1476 //===----------------------------------------------------------------------===//
1483 Chk->DeallocSentTag = in registerRetainCountBase()
1485 Chk->CastFailTag = in registerRetainCountBase()
1494 Chk->TrackObjCAndCFObjects = true; in registerRetainCountChecker()
1495 Chk->TrackNSCFStartParam = Mgr.getAnalyzerOptions().getCheckerBooleanOption( in registerRetainCountChecker()
1499 Chk->KIND = std::make_unique<RefCountBug>(Mgr.getCurrentCheckerName(), \ in registerRetainCountChecker()
1519 Chk->TrackOSObjects = true; in registerOSObjectRetainCountChecker()
1526 // For the most part, we want **non-hidden checkers** to be associated with in registerOSObjectRetainCountChecker()
1527 // diagnostics, and **hidden checker options** with the fine-tuning of in registerOSObjectRetainCountChecker()
1531 if (!Chk->KIND) \ in registerOSObjectRetainCountChecker()
1532 Chk->KIND = std::make_unique<RefCountBug>(Mgr.getCurrentCheckerName(), \ in registerOSObjectRetainCountChecker()