Lines Matching +full:mc +full:- +full:sid

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 auto ReferencedVars = R->referenced_vars(); in checkPostStmt()
171 if (VR->getSuperRegion() == R) { in checkPostStmt()
172 VR = MemMgr.getVarRegion(VR->getDecl(), LC); in checkPostStmt()
177 state = state->scanReachableSymbols<StopTrackingCallback>(Regions).getState(); in checkPostStmt()
187 QualType QT = CE->getType(); in checkPostStmt()
189 if (QT->isObjCObjectPointerType()) { in checkPostStmt()
197 switch (BE->getBridgeKind()) { in checkPostStmt()
232 for (const Stmt *Child : Ex->children()) { in processObjCLiterals()
233 SVal V = pred->getSVal(Child); in processObjCLiterals()
240 processNonLeakError(state, Child->getSourceRange(), hasErr, sym, C); in processObjCLiterals()
249 state->getSVal(Ex, pred->getLocationContext()).getAsSymbol()) { in processObjCLiterals()
250 QualType ResultTy = Ex->getType(); in processObjCLiterals()
273 ProgramStateRef State = Pred->getState(); in checkPostStmt()
275 if (SymbolRef Sym = Pred->getSVal(Ex).getAsSymbol()) { in checkPostStmt()
276 QualType ResultTy = Ex->getType(); in checkPostStmt()
291 SymbolRef Sym = State->getSVal(*IVarLoc).getAsSymbol(); in checkPostStmt()
292 if (!Sym || !isa_and_nonnull<ObjCIvarRegion>(Sym->getOriginRegion())) in checkPostStmt()
298 QualType Ty = Sym->getType(); in checkPostStmt()
300 if (Ty->isObjCRetainableType()) in checkPostStmt()
308 ConstraintManager &CMgr = State->getConstraintManager(); in checkPostStmt()
315 if (RV->getIvarAccessHistory() != RefVal::IvarAccessHistory::None || in checkPostStmt()
321 C.addTransition(setRefBinding(State, Sym, RV->withIvarAccess())); in checkPostStmt()
338 if (const auto *MC = dyn_cast<ObjCMethodCall>(&Call)) { in isReceiverUnconsumedSelf() local
342 return MC->getMethodFamily() == OMF_init && MC->isReceiverSelfOrSuper() && in isReceiverUnconsumedSelf()
344 ->getAnalysisDeclContext() in isReceiverUnconsumedSelf()
345 ->getParentMap() in isReceiverUnconsumedSelf()
368 if (const auto *MC = dyn_cast<ObjCMethodCall>(&Call)) { in checkPostCall() local
369 if (MC->isInstanceMessage()) { in checkPostCall()
370 SVal ReceiverV = MC->getReceiverSVal(); in checkPostCall()
373 ReceiverType = T->getType(); in checkPostCall()
386 /// GetReturnType - Used to get the return type of a message expression or
394 QualType RetTy = RetE->getType(); in GetReturnType()
399 if (const ObjCObjectPointerType *PT = RetTy->getAs<ObjCObjectPointerType>()) in GetReturnType()
400 if (PT->isObjCQualifiedIdType() || PT->isObjCIdType() || in GetReturnType()
401 PT->isObjCClassType()) { in GetReturnType()
406 const ObjCInterfaceDecl *D = ME->getReceiverInterface(); in GetReturnType()
426 QualType PT = QT->getPointeeType(); in isPointerToObject()
428 if (PT->getAsCXXRecordDecl()) in isPointerToObject()
437 if (TrackedValue->getObjKind() != ObjKind::OS) in shouldEscapeOSArgumentOnCall()
441 return !isPointerToObject(CE.parameters()[ArgIdx]->getType()); in shouldEscapeOSArgumentOnCall()
469 if (SymbolRef Sym = MsgInvocation->getReceiverSVal().getAsLocSymbol()) { in processSummaryOfInlined()
489 cast<SubRegion>(MR)->getSuperRegion()); in isSmartPtrField()
490 return TR && RetainSummaryManager::isKnownSmartPointer(TR->getValueType()); in isSmartPtrField()
496 /// - binding to something that is not a memory region.
497 /// - binding to a memregion that does not have stack storage
498 /// - binding to a variable that has a destructor attached using CleanupAttr
510 if (!R->hasStackStorage() || !VR) in shouldEscapeRegion()
513 const VarDecl *VD = VR->getDecl(); in shouldEscapeRegion()
514 if (!VD->hasAttr<CleanupAttr>()) in shouldEscapeRegion()
539 if (!CE.getResultType()->isScalarType()) { in updateOutParameters()
545 AssumeNonZeroReturn = AssumeNonZeroReturn->assume(*DL, true); in updateOutParameters()
546 AssumeZeroReturn = AssumeZeroReturn->assume(*DL, false); in updateOutParameters()
558 QualType PointeeTy = ArgRegion->getValueType(); in updateOutParameters()
559 SVal PointeeVal = State->getSVal(ArgRegion); in updateOutParameters()
644 if (SymbolRef Sym = MsgInvocation->getReceiverSVal().getAsLocSymbol()) { in checkSummary()
650 ErrorRange = MsgInvocation->getOriginExpr()->getReceiverRange(); in checkSummary()
658 if (SymbolRef Sym = MCall->getCXXThisVal().getAsLocSymbol()) { in checkSummary()
663 ErrorRange = MCall->getOriginExpr()->getSourceRange(); in checkSummary()
732 // Handle all use-after-releases. in updateSymbol()
744 llvm_unreachable("Applies to pointer-to-pointer parameters, which should " in updateSymbol()
747 case Dealloc: // NB. we only need to add a note in a non-error case. in updateSymbol()
815 V = V - 1; in updateSymbol()
822 V = V - 1; in updateSymbol()
850 if (Sym->getType()->getPointeeCXXRecordDecl()) in errorKindToBugKind()
863 // HACK: Ignore retain-count issues on values accessed through ivars, in processNonLeakError()
870 if (RV->getIvarAccessHistory() != RefVal::IvarAccessHistory::None) in processNonLeakError()
880 report->addRange(ErrorRange); in processNonLeakError()
884 //===----------------------------------------------------------------------===//
885 // Handle the return values of retain-count-related functions.
886 //===----------------------------------------------------------------------===//
923 ? cast<CXXMemberCallExpr>(CE)->getImplicitObjectArgument() in evalCall()
924 : CE->getArg(0); in evalCall()
925 SVal RetVal = state->getSVal(BindReturnTo, LCtx); in evalCall()
939 state = state->BindExpr(CE, LCtx, RetVal, /*Invalidate=*/false); in evalCall()
946 NullOutputState = NullOutputState->BindExpr( in evalCall()
952 // output are non-zero. in evalCall()
954 state = state->assume(*L, /*assumption=*/true); in evalCall()
967 // Only adjust the reference count if this is the top-level call frame, in processReturn()
978 const Expr *RetE = S->getRetValue(); in processReturn()
985 SymbolRef Sym = state->getSValAsScalarOrLoc(RetE, C.getLocationContext()) in processReturn()
1002 X.setCount(cnt - 1); in processReturn()
1010 X.setCount(cnt - 1); in processReturn()
1028 // been over- or under-retained. in processReturn()
1049 const Decl *CD = &Pred->getCodeDecl(); in processReturn()
1055 RE = Summ->getRetEffect(); in processReturn()
1059 RE = Summ->getRetEffect(); in processReturn()
1072 // HACK: Ignore retain-count issues on values accessed through ivars, in checkReturnWithRetEffect()
1133 //===----------------------------------------------------------------------===//
1135 //===----------------------------------------------------------------------===//
1145 state = state->scanReachableSymbols<StopTrackingCallback>(val).getState(); in checkBind()
1159 RefBindingsTy B = state->get<RefBindings>(); in evalAssume()
1165 RefBindingsTy::Factory &RefBFactory = state->get_context<RefBindings>(); in evalAssume()
1166 ConstraintManager &CMgr = state->getConstraintManager(); in evalAssume()
1178 state = state->set<RefBindings>(B); in evalAssume()
1194 if (const SymbolicRegion *SR = I->StripCasts()->getAs<SymbolicRegion>()) in checkRegionChanges()
1195 AllowedSymbols.insert(SR->getSymbol()); in checkRegionChanges()
1200 // Remove any existing reference-count binding. in checkRegionChanges()
1227 // If we would over-release here, but we know the value came from an ivar, in handleAutoreleaseCounts()
1232 --ACnt; in handleAutoreleaseCounts()
1244 V.setCount(V.getCount() - ACnt); in handleAutoreleaseCounts()
1250 // HACK: Ignore retain-count issues on values accessed through ivars, in handleAutoreleaseCounts()
1286 SymbolRef sid, RefVal V, in handleSymbolDeath() argument
1290 // HACK: Ignore retain-count issues on values accessed through ivars, in handleSymbolDeath()
1306 return removeRefBinding(state, sid); in handleSymbolDeath()
1308 Leaked.push_back(sid); in handleSymbolDeath()
1309 return setRefBinding(state, sid, V ^ RefVal::ErrorLeak); in handleSymbolDeath()
1337 const Decl *D = LCtx->getDecl(); in checkBeginFunction()
1345 ArgEffects CalleeSideArgEffects = FunctionSummary->getArgEffects(); in checkBeginFunction()
1347 for (unsigned idx = 0, e = C->param_size(); idx != e; ++idx) { in checkBeginFunction()
1348 const ParmVarDecl *Param = C->parameters()[idx]; in checkBeginFunction()
1349 SymbolRef Sym = state->getSVal(state->getRegion(Param, LCtx)).getAsSymbol(); in checkBeginFunction()
1351 QualType Ty = Param->getType(); in checkBeginFunction()
1354 ObjKind K = AE->getObjKind(); in checkBeginFunction()
1357 RefVal NewVal = AE->getKind() == DecRef ? RefVal::makeOwned(K, Ty) in checkBeginFunction()
1376 ProgramStateRef state = Pred->getState(); in checkEndFunction()
1377 RefBindingsTy B = state->get<RefBindings>(); in checkEndFunction()
1380 const LocationContext *LCtx = Pred->getLocationContext(); in checkEndFunction()
1381 if (LCtx->getAnalysisDeclContext()->isBodyAutosynthesized()) { in checkEndFunction()
1382 assert(!LCtx->inTopFrame()); in checkEndFunction()
1397 if (LCtx->getParent()) in checkEndFunction()
1400 B = state->get<RefBindings>(); in checkEndFunction()
1417 for (const auto &I: state->get<RefBindings>()) { in checkDeadSymbols()
1445 RefBindingsTy::Factory &F = state->get_context<RefBindings>(); in checkDeadSymbols()
1446 RefBindingsTy B = state->get<RefBindings>(); in checkDeadSymbols()
1451 state = state->set<RefBindings>(B); in checkDeadSymbols()
1458 RefBindingsTy B = State->get<RefBindings>(); in printState()
1472 //===----------------------------------------------------------------------===//
1474 //===----------------------------------------------------------------------===//
1481 Chk->DeallocSentTag = in registerRetainCountBase()
1483 Chk->CastFailTag = in registerRetainCountBase()
1492 Chk->TrackObjCAndCFObjects = true; in registerRetainCountChecker()
1493 Chk->TrackNSCFStartParam = Mgr.getAnalyzerOptions().getCheckerBooleanOption( in registerRetainCountChecker()
1497 Chk->KIND = std::make_unique<RefCountBug>(Mgr.getCurrentCheckerName(), \ in registerRetainCountChecker()
1517 Chk->TrackOSObjects = true; in registerOSObjectRetainCountChecker()
1524 // For the most part, we want **non-hidden checkers** to be associated with in registerOSObjectRetainCountChecker()
1525 // diagnostics, and **hidden checker options** with the fine-tuning of in registerOSObjectRetainCountChecker()
1529 if (!Chk->KIND) \ in registerOSObjectRetainCountChecker()
1530 Chk->KIND = std::make_unique<RefCountBug>(Mgr.getCurrentCheckerName(), \ in registerOSObjectRetainCountChecker()