Lines Matching refs:State
56 void printState(raw_ostream &Out, ProgramStateRef State, const char *NL,
63 void checkLiveSymbols(ProgramStateRef State, SymbolReaper &SR) const;
114 bool hasSubscriptOperator(ProgramStateRef State, const MemRegion *Reg);
115 bool frontModifiable(ProgramStateRef State, const MemRegion *Reg);
116 bool backModifiable(ProgramStateRef State, const MemRegion *Reg);
117 SymbolRef getContainerBegin(ProgramStateRef State, const MemRegion *Cont);
118 SymbolRef getContainerEnd(ProgramStateRef State, const MemRegion *Cont);
119 ProgramStateRef createContainerBegin(ProgramStateRef State,
123 ProgramStateRef createContainerEnd(ProgramStateRef State, const MemRegion *Cont,
127 ProgramStateRef setContainerData(ProgramStateRef State, const MemRegion *Cont,
129 ProgramStateRef invalidateAllIteratorPositions(ProgramStateRef State,
132 invalidateAllIteratorPositionsExcept(ProgramStateRef State,
135 ProgramStateRef invalidateIteratorPositions(ProgramStateRef State,
138 ProgramStateRef invalidateIteratorPositions(ProgramStateRef State,
143 ProgramStateRef reassignAllIteratorPositions(ProgramStateRef State,
146 ProgramStateRef reassignAllIteratorPositionsUnless(ProgramStateRef State,
152 ProgramStateRef State, SValBuilder &SVB, SymbolRef OldSym,
154 SymbolRef rebaseSymbol(ProgramStateRef State, SValBuilder &SVB, SymbolRef Expr,
156 bool hasLiveIterators(ProgramStateRef State, const MemRegion *Cont);
221 void ContainerModeling::checkLiveSymbols(ProgramStateRef State, in checkLiveSymbols() argument
224 auto ContMap = State->get<ContainerMap>(); in checkLiveSymbols()
243 auto State = C.getState(); in checkDeadSymbols() local
245 auto ContMap = State->get<ContainerMap>(); in checkDeadSymbols()
250 if (!hasLiveIterators(State, Cont.first)) { in checkDeadSymbols()
251 State = State->remove<ContainerMap>(Cont.first); in checkDeadSymbols()
256 C.addTransition(State); in checkDeadSymbols()
269 auto State = C.getState(); in handleBegin() local
270 auto BeginSym = getContainerBegin(State, ContReg); in handleBegin()
272 State = createContainerBegin(State, ContReg, CE, C.getASTContext().LongTy, in handleBegin()
274 BeginSym = getContainerBegin(State, ContReg); in handleBegin()
276 State = setIteratorPosition(State, RetVal, in handleBegin()
278 C.addTransition(State); in handleBegin()
291 auto State = C.getState(); in handleEnd() local
292 auto EndSym = getContainerEnd(State, ContReg); in handleEnd()
294 State = createContainerEnd(State, ContReg, CE, C.getASTContext().LongTy, in handleEnd()
296 EndSym = getContainerEnd(State, ContReg); in handleEnd()
298 State = setIteratorPosition(State, RetVal, in handleEnd()
300 C.addTransition(State); in handleEnd()
313 auto State = C.getState(); in handleAssignment() local
314 const auto CData = getContainerData(State, ContReg); in handleAssignment()
316 State = invalidateAllIteratorPositions(State, ContReg); in handleAssignment()
325 const auto OldCData = getContainerData(State, OldContReg); in handleAssignment()
332 State = reassignAllIteratorPositionsUnless(State, OldContReg, ContReg, in handleAssignment()
340 State = assumeNoOverflow(State, NewEndSym, 4); in handleAssignment()
342 State = setContainerData(State, ContReg, CData->newEnd(NewEndSym)); in handleAssignment()
344 State = setContainerData(State, ContReg, in handleAssignment()
349 State = rebaseSymbolInIteratorPositionsIf( in handleAssignment()
350 State, SVB, OldEndSym, NewEndSym, OldEndSym, BO_LT); in handleAssignment()
354 State = reassignAllIteratorPositions(State, OldContReg, ContReg); in handleAssignment()
360 State = in handleAssignment()
361 setContainerData(State, ContReg, CData->newBegin(OldBeginSym)); in handleAssignment()
363 State = setContainerData(State, ContReg, in handleAssignment()
366 State = in handleAssignment()
367 setContainerData(State, OldContReg, OldCData->newBegin(nullptr)); in handleAssignment()
372 State = reassignAllIteratorPositions(State, OldContReg, ContReg); in handleAssignment()
376 C.addTransition(State); in handleAssignment()
388 auto State = C.getState(); in handleAssign() local
389 State = invalidateAllIteratorPositions(State, ContReg); in handleAssign()
390 C.addTransition(State); in handleAssign()
403 auto State = C.getState(); in handleClear() local
404 if (!hasSubscriptOperator(State, ContReg) || in handleClear()
405 !backModifiable(State, ContReg)) { in handleClear()
406 const auto CData = getContainerData(State, ContReg); in handleClear()
409 State = in handleClear()
410 invalidateAllIteratorPositionsExcept(State, ContReg, EndSym, BO_GE); in handleClear()
411 C.addTransition(State); in handleClear()
418 State = invalidateAllIteratorPositions(State, ContReg); in handleClear()
419 C.addTransition(State, ChangeTag); in handleClear()
431 auto State = C.getState(); in handlePushBack() local
432 if (hasSubscriptOperator(State, ContReg) && frontModifiable(State, ContReg)) { in handlePushBack()
433 State = invalidateAllIteratorPositions(State, ContReg); in handlePushBack()
434 C.addTransition(State); in handlePushBack()
438 const auto CData = getContainerData(State, ContReg); in handlePushBack()
444 if (hasSubscriptOperator(State, ContReg)) { in handlePushBack()
445 State = invalidateIteratorPositions(State, EndSym, BO_GE); in handlePushBack()
451 SVB.evalBinOp(State, BO_Add, in handlePushBack()
457 State = setContainerData(State, ContReg, CData->newEnd(newEndSym)); in handlePushBack()
458 C.addTransition(State, ChangeTag); in handlePushBack()
470 auto State = C.getState(); in handlePopBack() local
471 const auto CData = getContainerData(State, ContReg); in handlePopBack()
480 SVB.evalBinOp(State, BO_Sub, in handlePopBack()
489 if (hasSubscriptOperator(State, ContReg) && in handlePopBack()
490 backModifiable(State, ContReg)) { in handlePopBack()
491 State = invalidateIteratorPositions(State, BackSym, BO_GE); in handlePopBack()
492 State = setContainerData(State, ContReg, CData->newEnd(nullptr)); in handlePopBack()
494 State = invalidateIteratorPositions(State, BackSym, BO_EQ); in handlePopBack()
497 State = setContainerData(State, ContReg, CData->newEnd(newEndSym)); in handlePopBack()
498 C.addTransition(State, ChangeTag); in handlePopBack()
511 auto State = C.getState(); in handlePushFront() local
512 if (hasSubscriptOperator(State, ContReg)) { in handlePushFront()
513 State = invalidateAllIteratorPositions(State, ContReg); in handlePushFront()
514 C.addTransition(State); in handlePushFront()
516 const auto CData = getContainerData(State, ContReg); in handlePushFront()
525 SVB.evalBinOp(State, BO_Sub, in handlePushFront()
531 State = setContainerData(State, ContReg, CData->newBegin(newBeginSym)); in handlePushFront()
532 C.addTransition(State, ChangeTag); in handlePushFront()
545 auto State = C.getState(); in handlePopFront() local
546 const auto CData = getContainerData(State, ContReg); in handlePopFront()
553 if (hasSubscriptOperator(State, ContReg)) { in handlePopFront()
554 State = invalidateIteratorPositions(State, BeginSym, BO_LE); in handlePopFront()
556 State = invalidateIteratorPositions(State, BeginSym, BO_EQ); in handlePopFront()
562 SVB.evalBinOp(State, BO_Add, in handlePopFront()
568 State = setContainerData(State, ContReg, CData->newBegin(newBeginSym)); in handlePopFront()
569 C.addTransition(State, ChangeTag); in handlePopFront()
581 auto State = C.getState(); in handleInsert() local
582 const auto *Pos = getIteratorPosition(State, Iter); in handleInsert()
588 if (hasSubscriptOperator(State, ContReg) && backModifiable(State, ContReg)) { in handleInsert()
589 if (frontModifiable(State, ContReg)) { in handleInsert()
590 State = invalidateAllIteratorPositions(State, ContReg); in handleInsert()
592 State = invalidateIteratorPositions(State, Pos->getOffset(), BO_GE); in handleInsert()
594 if (const auto *CData = getContainerData(State, ContReg)) { in handleInsert()
596 State = invalidateIteratorPositions(State, EndSym, BO_GE); in handleInsert()
597 State = setContainerData(State, ContReg, CData->newEnd(nullptr)); in handleInsert()
600 C.addTransition(State); in handleInsert()
612 auto State = C.getState(); in handleErase() local
613 const auto *Pos = getIteratorPosition(State, Iter); in handleErase()
620 if (hasSubscriptOperator(State, ContReg) && backModifiable(State, ContReg)) { in handleErase()
621 if (frontModifiable(State, ContReg)) { in handleErase()
622 State = invalidateAllIteratorPositions(State, ContReg); in handleErase()
624 State = invalidateIteratorPositions(State, Pos->getOffset(), BO_GE); in handleErase()
626 if (const auto *CData = getContainerData(State, ContReg)) { in handleErase()
628 State = invalidateIteratorPositions(State, EndSym, BO_GE); in handleErase()
629 State = setContainerData(State, ContReg, CData->newEnd(nullptr)); in handleErase()
633 State = invalidateIteratorPositions(State, Pos->getOffset(), BO_EQ); in handleErase()
635 C.addTransition(State); in handleErase()
645 auto State = C.getState(); in handleErase() local
646 const auto *Pos1 = getIteratorPosition(State, Iter1); in handleErase()
647 const auto *Pos2 = getIteratorPosition(State, Iter2); in handleErase()
655 if (hasSubscriptOperator(State, ContReg) && backModifiable(State, ContReg)) { in handleErase()
656 if (frontModifiable(State, ContReg)) { in handleErase()
657 State = invalidateAllIteratorPositions(State, ContReg); in handleErase()
659 State = invalidateIteratorPositions(State, Pos1->getOffset(), BO_GE); in handleErase()
661 if (const auto *CData = getContainerData(State, ContReg)) { in handleErase()
663 State = invalidateIteratorPositions(State, EndSym, BO_GE); in handleErase()
664 State = setContainerData(State, ContReg, CData->newEnd(nullptr)); in handleErase()
668 State = invalidateIteratorPositions(State, Pos1->getOffset(), BO_GE, in handleErase()
671 C.addTransition(State); in handleErase()
676 auto State = C.getState(); in handleEraseAfter() local
677 const auto *Pos = getIteratorPosition(State, Iter); in handleEraseAfter()
687 SVB.evalBinOp(State, BO_Add, in handleEraseAfter()
691 State = invalidateIteratorPositions(State, NextSym, BO_EQ); in handleEraseAfter()
692 C.addTransition(State); in handleEraseAfter()
697 auto State = C.getState(); in handleEraseAfter() local
698 const auto *Pos1 = getIteratorPosition(State, Iter1); in handleEraseAfter()
699 const auto *Pos2 = getIteratorPosition(State, Iter2); in handleEraseAfter()
704 State = invalidateIteratorPositions(State, Pos1->getOffset(), BO_GT, in handleEraseAfter()
706 C.addTransition(State); in handleEraseAfter()
736 void ContainerModeling::printState(raw_ostream &Out, ProgramStateRef State, in printState() argument
738 auto ContMap = State->get<ContainerMap>(); in printState()
776 const CXXRecordDecl *getCXXRecordDecl(ProgramStateRef State, in getCXXRecordDecl() argument
778 auto TI = getDynamicTypeInfo(State, Reg); in getCXXRecordDecl()
790 bool hasSubscriptOperator(ProgramStateRef State, const MemRegion *Reg) { in hasSubscriptOperator() argument
791 const auto *CRD = getCXXRecordDecl(State, Reg); in hasSubscriptOperator()
806 bool frontModifiable(ProgramStateRef State, const MemRegion *Reg) { in frontModifiable() argument
807 const auto *CRD = getCXXRecordDecl(State, Reg); in frontModifiable()
821 bool backModifiable(ProgramStateRef State, const MemRegion *Reg) { in backModifiable() argument
822 const auto *CRD = getCXXRecordDecl(State, Reg); in backModifiable()
836 SymbolRef getContainerBegin(ProgramStateRef State, const MemRegion *Cont) { in getContainerBegin() argument
837 const auto *CDataPtr = getContainerData(State, Cont); in getContainerBegin()
844 SymbolRef getContainerEnd(ProgramStateRef State, const MemRegion *Cont) { in getContainerEnd() argument
845 const auto *CDataPtr = getContainerData(State, Cont); in getContainerEnd()
852 ProgramStateRef createContainerBegin(ProgramStateRef State, in createContainerBegin() argument
857 const auto *CDataPtr = getContainerData(State, Cont); in createContainerBegin()
859 return State; in createContainerBegin()
861 auto &SymMgr = State->getSymbolManager(); in createContainerBegin()
864 State = assumeNoOverflow(State, Sym, 4); in createContainerBegin()
868 return setContainerData(State, Cont, CData); in createContainerBegin()
872 return setContainerData(State, Cont, CData); in createContainerBegin()
875 ProgramStateRef createContainerEnd(ProgramStateRef State, const MemRegion *Cont, in createContainerEnd() argument
880 const auto *CDataPtr = getContainerData(State, Cont); in createContainerEnd()
882 return State; in createContainerEnd()
884 auto &SymMgr = State->getSymbolManager(); in createContainerEnd()
887 State = assumeNoOverflow(State, Sym, 4); in createContainerEnd()
891 return setContainerData(State, Cont, CData); in createContainerEnd()
895 return setContainerData(State, Cont, CData); in createContainerEnd()
898 ProgramStateRef setContainerData(ProgramStateRef State, const MemRegion *Cont, in setContainerData() argument
900 return State->set<ContainerMap>(Cont, CData); in setContainerData()
904 ProgramStateRef processIteratorPositions(ProgramStateRef State, Condition Cond, in processIteratorPositions() argument
906 auto &RegionMapFactory = State->get_context<IteratorRegionMap>(); in processIteratorPositions()
907 auto RegionMap = State->get<IteratorRegionMap>(); in processIteratorPositions()
917 State = State->set<IteratorRegionMap>(RegionMap); in processIteratorPositions()
919 auto &SymbolMapFactory = State->get_context<IteratorSymbolMap>(); in processIteratorPositions()
920 auto SymbolMap = State->get<IteratorSymbolMap>(); in processIteratorPositions()
930 State = State->set<IteratorSymbolMap>(SymbolMap); in processIteratorPositions()
932 return State; in processIteratorPositions()
935 ProgramStateRef invalidateAllIteratorPositions(ProgramStateRef State, in invalidateAllIteratorPositions() argument
943 return processIteratorPositions(State, MatchCont, Invalidate); in invalidateAllIteratorPositions()
947 invalidateAllIteratorPositionsExcept(ProgramStateRef State, in invalidateAllIteratorPositionsExcept() argument
952 !compare(State, Pos.getOffset(), Offset, Opc); in invalidateAllIteratorPositionsExcept()
957 return processIteratorPositions(State, MatchContAndCompare, Invalidate); in invalidateAllIteratorPositionsExcept()
960 ProgramStateRef invalidateIteratorPositions(ProgramStateRef State, in invalidateIteratorPositions() argument
964 return compare(State, Pos.getOffset(), Offset, Opc); in invalidateIteratorPositions()
969 return processIteratorPositions(State, Compare, Invalidate); in invalidateIteratorPositions()
972 ProgramStateRef invalidateIteratorPositions(ProgramStateRef State, in invalidateIteratorPositions() argument
978 return compare(State, Pos.getOffset(), Offset1, Opc1) && in invalidateIteratorPositions()
979 compare(State, Pos.getOffset(), Offset2, Opc2); in invalidateIteratorPositions()
984 return processIteratorPositions(State, Compare, Invalidate); in invalidateIteratorPositions()
987 ProgramStateRef reassignAllIteratorPositions(ProgramStateRef State, in reassignAllIteratorPositions() argument
996 return processIteratorPositions(State, MatchCont, ReAssign); in reassignAllIteratorPositions()
999 ProgramStateRef reassignAllIteratorPositionsUnless(ProgramStateRef State, in reassignAllIteratorPositionsUnless() argument
1006 !compare(State, Pos.getOffset(), Offset, Opc); in reassignAllIteratorPositionsUnless()
1011 return processIteratorPositions(State, MatchContAndCompare, ReAssign); in reassignAllIteratorPositionsUnless()
1018 ProgramStateRef State, SValBuilder &SVB, SymbolRef OldSym, in rebaseSymbolInIteratorPositionsIf() argument
1021 return compare(State, Pos.getOffset(), CondSym, Opc); in rebaseSymbolInIteratorPositionsIf()
1024 return Pos.setTo(rebaseSymbol(State, SVB, Pos.getOffset(), OldSym, in rebaseSymbolInIteratorPositionsIf()
1027 return processIteratorPositions(State, LessThanEnd, RebaseSymbol); in rebaseSymbolInIteratorPositionsIf()
1033 SymbolRef rebaseSymbol(ProgramStateRef State, SValBuilder &SVB, in rebaseSymbol() argument
1037 auto Diff = SVB.evalBinOpNN(State, BO_Sub, nonloc::SymbolVal(OrigExpr), in rebaseSymbol()
1045 return SVB.evalBinOpNN(State, BO_Add, *DiffInt, nonloc::SymbolVal(NewSym), in rebaseSymbol()
1049 bool hasLiveIterators(ProgramStateRef State, const MemRegion *Cont) { in hasLiveIterators() argument
1050 auto RegionMap = State->get<IteratorRegionMap>(); in hasLiveIterators()
1056 auto SymbolMap = State->get<IteratorSymbolMap>(); in hasLiveIterators()