Lines Matching full:state
57 void printState(raw_ostream &Out, ProgramStateRef State, const char *NL,
64 void checkLiveSymbols(ProgramStateRef State, SymbolReaper &SR) const;
105 bool hasSubscriptOperator(ProgramStateRef State, const MemRegion *Reg);
106 bool frontModifiable(ProgramStateRef State, const MemRegion *Reg);
107 bool backModifiable(ProgramStateRef State, const MemRegion *Reg);
108 SymbolRef getContainerBegin(ProgramStateRef State, const MemRegion *Cont);
109 SymbolRef getContainerEnd(ProgramStateRef State, const MemRegion *Cont);
110 ProgramStateRef createContainerBegin(ProgramStateRef State,
114 ProgramStateRef createContainerEnd(ProgramStateRef State, const MemRegion *Cont,
118 ProgramStateRef setContainerData(ProgramStateRef State, const MemRegion *Cont,
120 ProgramStateRef invalidateAllIteratorPositions(ProgramStateRef State,
123 invalidateAllIteratorPositionsExcept(ProgramStateRef State,
126 ProgramStateRef invalidateIteratorPositions(ProgramStateRef State,
129 ProgramStateRef invalidateIteratorPositions(ProgramStateRef State,
134 ProgramStateRef reassignAllIteratorPositions(ProgramStateRef State,
137 ProgramStateRef reassignAllIteratorPositionsUnless(ProgramStateRef State,
143 ProgramStateRef State, SValBuilder &SVB, SymbolRef OldSym,
145 SymbolRef rebaseSymbol(ProgramStateRef State, SValBuilder &SVB, SymbolRef Expr,
147 bool hasLiveIterators(ProgramStateRef State, const MemRegion *Cont);
212 void ContainerModeling::checkLiveSymbols(ProgramStateRef State,
215 auto ContMap = State->get<ContainerMap>();
234 auto State = C.getState();
236 auto ContMap = State->get<ContainerMap>();
241 if (!hasLiveIterators(State, Cont.first)) {
242 State = State->remove<ContainerMap>(Cont.first);
247 C.addTransition(State);
260 auto State = C.getState();
261 auto BeginSym = getContainerBegin(State, ContReg);
263 State = createContainerBegin(State, ContReg, CE, C.getASTContext().LongTy,
265 BeginSym = getContainerBegin(State, ContReg);
267 State = setIteratorPosition(State, RetVal,
269 C.addTransition(State);
282 auto State = C.getState();
283 auto EndSym = getContainerEnd(State, ContReg);
285 State = createContainerEnd(State, ContReg, CE, C.getASTContext().LongTy,
287 EndSym = getContainerEnd(State, ContReg);
289 State = setIteratorPosition(State, RetVal,
291 C.addTransition(State);
304 auto State = C.getState();
305 const auto CData = getContainerData(State, ContReg);
307 State = invalidateAllIteratorPositions(State, ContReg);
316 const auto OldCData = getContainerData(State, OldContReg);
323 State = reassignAllIteratorPositionsUnless(State, OldContReg, ContReg,
331 State = assumeNoOverflow(State, NewEndSym, 4);
333 State = setContainerData(State, ContReg, CData->newEnd(NewEndSym));
335 State = setContainerData(State, ContReg,
340 State = rebaseSymbolInIteratorPositionsIf(
341 State, SVB, OldEndSym, NewEndSym, OldEndSym, BO_LT);
345 State = reassignAllIteratorPositions(State, OldContReg, ContReg);
351 State =
352 setContainerData(State, ContReg, CData->newBegin(OldBeginSym));
354 State = setContainerData(State, ContReg,
357 State =
358 setContainerData(State, OldContReg, OldCData->newBegin(nullptr));
363 State = reassignAllIteratorPositions(State, OldContReg, ContReg);
367 C.addTransition(State);
379 auto State = C.getState();
380 State = invalidateAllIteratorPositions(State, ContReg);
381 C.addTransition(State);
394 auto State = C.getState();
395 if (!hasSubscriptOperator(State, ContReg) ||
396 !backModifiable(State, ContReg)) {
397 const auto CData = getContainerData(State, ContReg);
400 State =
401 invalidateAllIteratorPositionsExcept(State, ContReg, EndSym, BO_GE);
402 C.addTransition(State);
409 State = invalidateAllIteratorPositions(State, ContReg);
410 C.addTransition(State, ChangeTag);
422 auto State = C.getState();
423 if (hasSubscriptOperator(State, ContReg) && frontModifiable(State, ContReg)) {
424 State = invalidateAllIteratorPositions(State, ContReg);
425 C.addTransition(State);
429 const auto CData = getContainerData(State, ContReg);
435 if (hasSubscriptOperator(State, ContReg)) {
436 State = invalidateIteratorPositions(State, EndSym, BO_GE);
442 SVB.evalBinOp(State, BO_Add,
448 State = setContainerData(State, ContReg, CData->newEnd(newEndSym));
449 C.addTransition(State, ChangeTag);
461 auto State = C.getState();
462 const auto CData = getContainerData(State, ContReg);
471 SVB.evalBinOp(State, BO_Sub,
480 if (hasSubscriptOperator(State, ContReg) &&
481 backModifiable(State, ContReg)) {
482 State = invalidateIteratorPositions(State, BackSym, BO_GE);
483 State = setContainerData(State, ContReg, CData->newEnd(nullptr));
485 State = invalidateIteratorPositions(State, BackSym, BO_EQ);
488 State = setContainerData(State, ContReg, CData->newEnd(newEndSym));
489 C.addTransition(State, ChangeTag);
502 auto State = C.getState();
503 if (hasSubscriptOperator(State, ContReg)) {
504 State = invalidateAllIteratorPositions(State, ContReg);
505 C.addTransition(State);
507 const auto CData = getContainerData(State, ContReg);
516 SVB.evalBinOp(State, BO_Sub,
522 State = setContainerData(State, ContReg, CData->newBegin(newBeginSym));
523 C.addTransition(State, ChangeTag);
536 auto State = C.getState();
537 const auto CData = getContainerData(State, ContReg);
544 if (hasSubscriptOperator(State, ContReg)) {
545 State = invalidateIteratorPositions(State, BeginSym, BO_LE);
547 State = invalidateIteratorPositions(State, BeginSym, BO_EQ);
553 SVB.evalBinOp(State, BO_Add,
559 State = setContainerData(State, ContReg, CData->newBegin(newBeginSym));
560 C.addTransition(State, ChangeTag);
572 auto State = C.getState();
573 const auto *Pos = getIteratorPosition(State, Iter);
579 if (hasSubscriptOperator(State, ContReg) && backModifiable(State, ContReg)) {
580 if (frontModifiable(State, ContReg)) {
581 State = invalidateAllIteratorPositions(State, ContReg);
583 State = invalidateIteratorPositions(State, Pos->getOffset(), BO_GE);
585 if (const auto *CData = getContainerData(State, ContReg)) {
587 State = invalidateIteratorPositions(State, EndSym, BO_GE);
588 State = setContainerData(State, ContReg, CData->newEnd(nullptr));
591 C.addTransition(State);
603 auto State = C.getState();
604 const auto *Pos = getIteratorPosition(State, Iter);
611 if (hasSubscriptOperator(State, ContReg) && backModifiable(State, ContReg)) {
612 if (frontModifiable(State, ContReg)) {
613 State = invalidateAllIteratorPositions(State, ContReg);
615 State = invalidateIteratorPositions(State, Pos->getOffset(), BO_GE);
617 if (const auto *CData = getContainerData(State, ContReg)) {
619 State = invalidateIteratorPositions(State, EndSym, BO_GE);
620 State = setContainerData(State, ContReg, CData->newEnd(nullptr));
624 State = invalidateIteratorPositions(State, Pos->getOffset(), BO_EQ);
626 C.addTransition(State);
636 auto State = C.getState();
637 const auto *Pos1 = getIteratorPosition(State, Iter1);
638 const auto *Pos2 = getIteratorPosition(State, Iter2);
646 if (hasSubscriptOperator(State, ContReg) && backModifiable(State, ContReg)) {
647 if (frontModifiable(State, ContReg)) {
648 State = invalidateAllIteratorPositions(State, ContReg);
650 State = invalidateIteratorPositions(State, Pos1->getOffset(), BO_GE);
652 if (const auto *CData = getContainerData(State, ContReg)) {
654 State = invalidateIteratorPositions(State, EndSym, BO_GE);
655 State = setContainerData(State, ContReg, CData->newEnd(nullptr));
659 State = invalidateIteratorPositions(State, Pos1->getOffset(), BO_GE,
662 C.addTransition(State);
667 auto State = C.getState();
668 const auto *Pos = getIteratorPosition(State, Iter);
678 SVB.evalBinOp(State, BO_Add,
682 State = invalidateIteratorPositions(State, NextSym, BO_EQ);
683 C.addTransition(State);
688 auto State = C.getState();
689 const auto *Pos1 = getIteratorPosition(State, Iter1);
690 const auto *Pos2 = getIteratorPosition(State, Iter2);
695 State = invalidateIteratorPositions(State, Pos1->getOffset(), BO_GT,
697 C.addTransition(State);
727 void ContainerModeling::printState(raw_ostream &Out, ProgramStateRef State,
729 auto ContMap = State->get<ContainerMap>();
767 const CXXRecordDecl *getCXXRecordDecl(ProgramStateRef State,
769 auto TI = getDynamicTypeInfo(State, Reg);
785 bool hasSubscriptOperator(ProgramStateRef State, const MemRegion *Reg) {
786 const auto *CRD = getCXXRecordDecl(State, Reg);
801 bool frontModifiable(ProgramStateRef State, const MemRegion *Reg) {
802 const auto *CRD = getCXXRecordDecl(State, Reg);
816 bool backModifiable(ProgramStateRef State, const MemRegion *Reg) {
817 const auto *CRD = getCXXRecordDecl(State, Reg);
831 SymbolRef getContainerBegin(ProgramStateRef State, const MemRegion *Cont) {
832 const auto *CDataPtr = getContainerData(State, Cont);
839 SymbolRef getContainerEnd(ProgramStateRef State, const MemRegion *Cont) {
840 const auto *CDataPtr = getContainerData(State, Cont);
847 ProgramStateRef createContainerBegin(ProgramStateRef State,
852 const auto *CDataPtr = getContainerData(State, Cont);
854 return State;
856 auto &SymMgr = State->getSymbolManager();
859 State = assumeNoOverflow(State, Sym, 4);
863 return setContainerData(State, Cont, CData);
867 return setContainerData(State, Cont, CData);
870 ProgramStateRef createContainerEnd(ProgramStateRef State, const MemRegion *Cont,
875 const auto *CDataPtr = getContainerData(State, Cont);
877 return State;
879 auto &SymMgr = State->getSymbolManager();
882 State = assumeNoOverflow(State, Sym, 4);
886 return setContainerData(State, Cont, CData);
890 return setContainerData(State, Cont, CData);
893 ProgramStateRef setContainerData(ProgramStateRef State, const MemRegion *Cont,
895 return State->set<ContainerMap>(Cont, CData);
899 ProgramStateRef processIteratorPositions(ProgramStateRef State, Condition Cond,
901 auto &RegionMapFactory = State->get_context<IteratorRegionMap>();
902 auto RegionMap = State->get<IteratorRegionMap>();
912 State = State->set<IteratorRegionMap>(RegionMap);
914 auto &SymbolMapFactory = State->get_context<IteratorSymbolMap>();
915 auto SymbolMap = State->get<IteratorSymbolMap>();
925 State = State->set<IteratorSymbolMap>(SymbolMap);
927 return State;
930 ProgramStateRef invalidateAllIteratorPositions(ProgramStateRef State,
938 return processIteratorPositions(State, MatchCont, Invalidate);
942 invalidateAllIteratorPositionsExcept(ProgramStateRef State,
947 !compare(State, Pos.getOffset(), Offset, Opc);
952 return processIteratorPositions(State, MatchContAndCompare, Invalidate);
955 ProgramStateRef invalidateIteratorPositions(ProgramStateRef State,
959 return compare(State, Pos.getOffset(), Offset, Opc);
964 return processIteratorPositions(State, Compare, Invalidate);
967 ProgramStateRef invalidateIteratorPositions(ProgramStateRef State,
973 return compare(State, Pos.getOffset(), Offset1, Opc1) &&
974 compare(State, Pos.getOffset(), Offset2, Opc2);
979 return processIteratorPositions(State, Compare, Invalidate);
982 ProgramStateRef reassignAllIteratorPositions(ProgramStateRef State,
991 return processIteratorPositions(State, MatchCont, ReAssign);
994 ProgramStateRef reassignAllIteratorPositionsUnless(ProgramStateRef State,
1001 !compare(State, Pos.getOffset(), Offset, Opc);
1006 return processIteratorPositions(State, MatchContAndCompare, ReAssign);
1013 ProgramStateRef State, SValBuilder &SVB, SymbolRef OldSym,
1016 return compare(State, Pos.getOffset(), CondSym, Opc);
1019 return Pos.setTo(rebaseSymbol(State, SVB, Pos.getOffset(), OldSym,
1022 return processIteratorPositions(State, LessThanEnd, RebaseSymbol);
1028 SymbolRef rebaseSymbol(ProgramStateRef State, SValBuilder &SVB,
1032 auto Diff = SVB.evalBinOpNN(State, BO_Sub, nonloc::SymbolVal(OrigExpr),
1040 return SVB.evalBinOpNN(State, BO_Add, *DiffInt, nonloc::SymbolVal(NewSym),
1044 bool hasLiveIterators(ProgramStateRef State, const MemRegion *Cont) {
1045 auto RegionMap = State->get<IteratorRegionMap>();
1051 auto SymbolMap = State->get<IteratorSymbolMap>();