Lines Matching defs:Call

45     : public Checker<eval::Call, check::DeadSymbols, check::RegionChanges,
48 bool isBoolConversionMethod(const CallEvent &Call) const;
53 bool evalCall(const CallEvent &Call, CheckerContext &C) const;
60 const LocationContext *LCtx, const CallEvent *Call) const;
66 void handleReset(const CallEvent &Call, CheckerContext &C) const;
67 void handleRelease(const CallEvent &Call, CheckerContext &C) const;
68 void handleSwapMethod(const CallEvent &Call, CheckerContext &C) const;
69 void handleGet(const CallEvent &Call, CheckerContext &C) const;
70 bool handleAssignOp(const CallEvent &Call, CheckerContext &C) const;
71 bool handleMoveCtr(const CallEvent &Call, CheckerContext &C,
75 const CallEvent &Call) const;
76 void handleBoolConversion(const CallEvent &Call, CheckerContext &C) const;
77 bool handleComparisionOp(const CallEvent &Call, CheckerContext &C) const;
78 bool handleOstreamOperator(const CallEvent &Call, CheckerContext &C) const;
87 void (SmartPtrModeling::*)(const CallEvent &Call, CheckerContext &) const;
127 bool isStdSmartPtrCall(const CallEvent &Call) {
128 const auto *MethodDecl = dyn_cast_or_null<CXXMethodDecl>(Call.getDecl());
201 static QualType getPointerTypeFromTemplateArg(const CallEvent &Call,
203 const auto *FD = dyn_cast_or_null<FunctionDecl>(Call.getDecl());
215 static QualType getInnerPointerType(const CallEvent &Call, CheckerContext &C) {
216 const auto *MethodDecl = dyn_cast_or_null<CXXMethodDecl>(Call.getDecl());
233 bool SmartPtrModeling::isBoolConversionMethod(const CallEvent &Call) const {
238 const auto *CD = dyn_cast_or_null<CXXConversionDecl>(Call.getDecl());
249 static bool isStdFunctionCall(const CallEvent &Call) {
250 return Call.getDecl() && Call.getDecl()->getDeclContext()->isStdNamespace();
253 static bool isStdOstreamOperatorCall(const CallEvent &Call) {
254 if (Call.getNumArgs() != 2 || !isStdFunctionCall(Call))
256 const auto *FC = dyn_cast<SimpleFunctionCall>(&Call);
265 return isStdSmartPtr(Call.getArgExpr(1)) &&
266 isStdBasicOstream(Call.getArgExpr(0));
269 static bool isPotentiallyComparisionOpCall(const CallEvent &Call) {
270 if (Call.getNumArgs() != 2 || !isStdFunctionCall(Call))
272 return smartptr::isStdSmartPtr(Call.getArgExpr(0)) ||
273 smartptr::isStdSmartPtr(Call.getArgExpr(1));
276 bool SmartPtrModeling::evalCall(const CallEvent &Call,
283 if (ModelSmartPtrDereference && isPotentiallyComparisionOpCall(Call))
284 if (handleComparisionOp(Call, C))
287 if (ModelSmartPtrDereference && isStdOstreamOperatorCall(Call))
288 return handleOstreamOperator(Call, C);
290 if (StdSwapCall.matches(Call)) {
292 assert(Call.getNumArgs() == 2 && "std::swap should have two arguments");
293 const Expr *FirstArg = Call.getArgExpr(0);
296 return handleSwap(State, Call.getArgSVal(0), Call.getArgSVal(1), C);
299 if (MakeUniqueVariants.contains(Call)) {
304 Call.getReturnValueUnderConstruction();
309 Call.getOriginExpr(), C.getLocationContext(),
310 getPointerTypeFromTemplateArg(Call, C), C.blockCount());
335 Call.getConstructionContext(), {});
343 if (!smartptr::isStdSmartPtrCall(Call))
346 if (isBoolConversionMethod(Call)) {
348 cast<CXXInstanceCall>(&Call)->getCXXThisVal().getAsRegion();
355 handleBoolConversion(Call, C);
366 Call.getOriginExpr(), C.getLocationContext(),
367 C.getSValBuilder().makeZeroVal(Call.getResultType())));
376 if (const auto *CC = dyn_cast<CXXConstructorCall>(&Call)) {
384 QualType ThisType = cast<CXXMethodDecl>(Call.getDecl())->getThisType();
387 return handleMoveCtr(Call, C, ThisRegion);
389 if (Call.getNumArgs() == 0) {
404 const auto *TrackingExpr = Call.getArgExpr(0);
407 auto ArgVal = Call.getArgSVal(0);
428 if (handleAssignOp(Call, C))
431 const SmartPtrMethodHandlerFn *Handler = SmartPtrMethodHandlers.lookup(Call);
434 (this->**Handler)(Call, C);
451 bool SmartPtrModeling::handleComparisionOp(const CallEvent &Call,
453 const auto *FC = dyn_cast<SimpleFunctionCall>(&Call);
483 SVal First = Call.getArgSVal(0);
484 SVal Second = Call.getArgSVal(1);
485 const auto *FirstExpr = Call.getArgExpr(0);
486 const auto *SecondExpr = Call.getArgExpr(1);
488 const auto *ResultExpr = Call.getOriginExpr();
499 Call.getResultType());
517 bool SmartPtrModeling::handleOstreamOperator(const CallEvent &Call,
528 const auto StreamVal = Call.getArgSVal(0);
533 State->invalidateRegions({StreamThisRegion}, Call.getOriginExpr(),
536 State->BindExpr(Call.getOriginExpr(), C.getLocationContext(), StreamVal);
577 const CallEvent *Call) const {
598 void SmartPtrModeling::handleReset(const CallEvent &Call,
601 const auto *IC = dyn_cast<CXXInstanceCall>(&Call);
609 assert(Call.getArgExpr(0)->getType()->isPointerType() &&
611 State = State->set<TrackedRegionMap>(ThisRegion, Call.getArgSVal(0));
612 const auto *TrackingExpr = Call.getArgExpr(0);
628 void SmartPtrModeling::handleRelease(const CallEvent &Call,
631 const auto *IC = dyn_cast<CXXInstanceCall>(&Call);
642 State = State->BindExpr(Call.getOriginExpr(), C.getLocationContext(),
646 QualType ThisType = cast<CXXMethodDecl>(Call.getDecl())->getThisType();
664 void SmartPtrModeling::handleSwapMethod(const CallEvent &Call,
667 const auto *IC = dyn_cast<CXXInstanceCall>(&Call);
672 handleSwap(State, IC->getCXXThisVal(), Call.getArgSVal(0), C);
712 void SmartPtrModeling::handleGet(const CallEvent &Call,
715 const auto *IC = dyn_cast<CXXInstanceCall>(&Call);
725 State, ThisRegion, Call.getOriginExpr(), Call.getResultType(), C);
726 State = State->BindExpr(Call.getOriginExpr(), C.getLocationContext(),
732 bool SmartPtrModeling::handleAssignOp(const CallEvent &Call,
735 const auto *OC = dyn_cast<CXXMemberOperatorCall>(&Call);
745 QualType ThisType = cast<CXXMethodDecl>(Call.getDecl())->getThisType();
750 bool AssignedNull = Call.getArgSVal(0).isZeroConstant();
767 return updateMovedSmartPointers(C, ThisRegion, OtherSmartPtrRegion, Call);
770 bool SmartPtrModeling::handleMoveCtr(const CallEvent &Call, CheckerContext &C,
772 const auto *OtherSmartPtrRegion = Call.getArgSVal(0).getAsRegion();
776 return updateMovedSmartPointers(C, ThisRegion, OtherSmartPtrRegion, Call);
781 const MemRegion *OtherSmartPtrRegion, const CallEvent &Call) const {
783 QualType ThisType = cast<CXXMethodDecl>(Call.getDecl())->getThisType();
834 void SmartPtrModeling::handleBoolConversion(const CallEvent &Call,
838 const Expr *CallExpr = Call.getOriginExpr();
840 cast<CXXInstanceCall>(&Call)->getCXXThisVal().getAsRegion();
842 QualType ThisType = cast<CXXMethodDecl>(Call.getDecl())->getThisType();
850 auto InnerPointerType = getInnerPointerType(Call, C);
875 C.getSValBuilder().makeZeroVal(Call.getResultType())));