Lines Matching refs:State

283   void checkLiveSymbols(ProgramStateRef State, SymbolReaper &SR) const;
285 ProgramStateRef evalAssume(ProgramStateRef State, SVal Cond,
325 bool hasSubscriptOperator(ProgramStateRef State, const MemRegion *Reg);
326 bool frontModifiable(ProgramStateRef State, const MemRegion *Reg);
327 bool backModifiable(ProgramStateRef State, const MemRegion *Reg);
330 const ProgramStateRef processComparison(ProgramStateRef State,
333 const ProgramStateRef saveComparison(ProgramStateRef State,
336 const IteratorComparison *loadComparison(ProgramStateRef State,
338 SymbolRef getContainerBegin(ProgramStateRef State, const MemRegion *Cont);
339 SymbolRef getContainerEnd(ProgramStateRef State, const MemRegion *Cont);
340 ProgramStateRef createContainerBegin(ProgramStateRef State,
343 ProgramStateRef createContainerEnd(ProgramStateRef State, const MemRegion *Cont,
345 const IteratorPosition *getIteratorPosition(ProgramStateRef State,
347 const IteratorPosition *getIteratorPosition(ProgramStateRef State,
349 ProgramStateRef setIteratorPosition(ProgramStateRef State, const SVal &Val,
351 ProgramStateRef setIteratorPosition(ProgramStateRef State,
354 ProgramStateRef removeIteratorPosition(ProgramStateRef State, const SVal &Val);
355 ProgramStateRef adjustIteratorPosition(ProgramStateRef State,
358 ProgramStateRef relateIteratorPositions(ProgramStateRef State,
362 ProgramStateRef invalidateAllIteratorPositions(ProgramStateRef State,
365 invalidateAllIteratorPositionsExcept(ProgramStateRef State,
368 ProgramStateRef invalidateIteratorPositions(ProgramStateRef State,
371 ProgramStateRef invalidateIteratorPositions(ProgramStateRef State,
376 ProgramStateRef reassignAllIteratorPositions(ProgramStateRef State,
379 ProgramStateRef reassignAllIteratorPositionsUnless(ProgramStateRef State,
385 ProgramStateRef State, SValBuilder &SVB, SymbolRef OldSym,
387 const ContainerData *getContainerData(ProgramStateRef State,
389 ProgramStateRef setContainerData(ProgramStateRef State, const MemRegion *Cont,
391 bool hasLiveIterators(ProgramStateRef State, const MemRegion *Cont);
394 bool isPastTheEnd(ProgramStateRef State, const IteratorPosition &Pos);
395 bool isAheadOfRange(ProgramStateRef State, const IteratorPosition &Pos);
396 bool isBehindPastTheEnd(ProgramStateRef State, const IteratorPosition &Pos);
397 bool isZero(ProgramStateRef State, const NonLoc &Val);
695 auto State = C.getState(); in checkPostCall() local
711 if (getIteratorPosition(State, Call.getReturnValue())) in checkPostCall()
716 if (const auto *Pos = getIteratorPosition(State, Call.getArgSVal(0))) { in checkPostCall()
717 State = setIteratorPosition(State, Call.getReturnValue(), *Pos); in checkPostCall()
719 State = removeIteratorPosition(State, Call.getArgSVal(0)); in checkPostCall()
721 C.addTransition(State); in checkPostCall()
733 if (const auto *Pos = getIteratorPosition(State, Call.getArgSVal(i))) { in checkPostCall()
745 auto State = C.getState(); in checkBind() local
746 const auto *Pos = getIteratorPosition(State, Val); in checkBind()
748 State = setIteratorPosition(State, Loc, *Pos); in checkBind()
749 C.addTransition(State); in checkBind()
751 const auto *OldPos = getIteratorPosition(State, Loc); in checkBind()
753 State = removeIteratorPosition(State, Loc); in checkBind()
754 C.addTransition(State); in checkBind()
762 auto State = C.getState(); in checkPostStmt() local
764 getIteratorPosition(State, C.getSVal(MTE->GetTemporaryExpr())); in checkPostStmt()
767 State = setIteratorPosition(State, C.getSVal(MTE), *Pos); in checkPostStmt()
768 C.addTransition(State); in checkPostStmt()
771 void IteratorChecker::checkLiveSymbols(ProgramStateRef State, in checkLiveSymbols() argument
775 auto RegionMap = State->get<IteratorRegionMap>(); in checkLiveSymbols()
783 auto SymbolMap = State->get<IteratorSymbolMap>(); in checkLiveSymbols()
791 auto ContMap = State->get<ContainerMap>(); in checkLiveSymbols()
810 auto State = C.getState(); in checkDeadSymbols() local
812 auto RegionMap = State->get<IteratorRegionMap>(); in checkDeadSymbols()
818 if (!isBoundThroughLazyCompoundVal(State->getEnvironment(), Reg.first)) { in checkDeadSymbols()
819 State = State->remove<IteratorRegionMap>(Reg.first); in checkDeadSymbols()
824 auto SymbolMap = State->get<IteratorSymbolMap>(); in checkDeadSymbols()
827 State = State->remove<IteratorSymbolMap>(Sym.first); in checkDeadSymbols()
831 auto ContMap = State->get<ContainerMap>(); in checkDeadSymbols()
836 if (!hasLiveIterators(State, Cont.first)) { in checkDeadSymbols()
837 State = State->remove<ContainerMap>(Cont.first); in checkDeadSymbols()
842 auto ComparisonMap = State->get<IteratorComparisonMap>(); in checkDeadSymbols()
845 State = State->remove<IteratorComparisonMap>(Comp.first); in checkDeadSymbols()
849 C.addTransition(State); in checkDeadSymbols()
852 ProgramStateRef IteratorChecker::evalAssume(ProgramStateRef State, SVal Cond, in evalAssume() argument
858 return State; in evalAssume()
862 return State; in evalAssume()
865 const auto *Comp = loadComparison(State, SE); in evalAssume()
870 return State; in evalAssume()
873 return State; in evalAssume()
879 return State; in evalAssume()
881 Comp = loadComparison(State, SE); in evalAssume()
883 return State; in evalAssume()
886 return processComparison(State, Comp->getLeft(), Comp->getRight(), in evalAssume()
897 auto State = C.getState(); in handleComparison() local
899 const auto *LPos = getIteratorPosition(State, LVal); in handleComparison()
900 const auto *RPos = getIteratorPosition(State, RVal); in handleComparison()
903 State = saveComparison(State, Condition, LVal, RVal, Op == OO_EqualEqual); in handleComparison()
904 C.addTransition(State); in handleComparison()
906 if ((State = processComparison( in handleComparison()
907 State, getRegionOrSymbol(LVal), getRegionOrSymbol(RVal), in handleComparison()
909 C.addTransition(State); in handleComparison()
911 C.generateSink(State, C.getPredecessor()); in handleComparison()
918 auto State = C.getState(); in verifyDereference() local
919 const auto *Pos = getIteratorPosition(State, Val); in verifyDereference()
920 if (Pos && isPastTheEnd(State, *Pos)) { in verifyDereference()
921 auto *N = C.generateNonFatalErrorNode(State); in verifyDereference()
930 auto State = C.getState(); in verifyAccess() local
931 const auto *Pos = getIteratorPosition(State, Val); in verifyAccess()
933 auto *N = C.generateNonFatalErrorNode(State); in verifyAccess()
945 auto State = C.getState(); in handleIncrement() local
946 const auto *Pos = getIteratorPosition(State, Iter); in handleIncrement()
953 State = setIteratorPosition(State, Iter, NewPos); in handleIncrement()
954 State = setIteratorPosition(State, RetVal, Postfix ? *Pos : NewPos); in handleIncrement()
955 C.addTransition(State); in handleIncrement()
963 auto State = C.getState(); in handleDecrement() local
964 const auto *Pos = getIteratorPosition(State, Iter); in handleDecrement()
971 State = setIteratorPosition(State, Iter, NewPos); in handleDecrement()
972 State = setIteratorPosition(State, RetVal, Postfix ? *Pos : NewPos); in handleDecrement()
973 C.addTransition(State); in handleDecrement()
984 static ProgramStateRef assumeNoOverflow(ProgramStateRef State, SymbolRef Sym, in assumeNoOverflow() argument
986 SValBuilder &SVB = State->getStateManager().getSValBuilder(); in assumeNoOverflow()
993 ProgramStateRef NewState = State; in assumeNoOverflow()
997 SVB.evalBinOpNN(State, BO_LE, nonloc::SymbolVal(Sym), in assumeNoOverflow()
1002 return State; in assumeNoOverflow()
1007 SVB.evalBinOpNN(State, BO_GE, nonloc::SymbolVal(Sym), in assumeNoOverflow()
1012 return State; in assumeNoOverflow()
1025 auto State = C.getState(); in handleRandomIncrOrDecr() local
1026 const auto *Pos = getIteratorPosition(State, LHS); in handleRandomIncrOrDecr()
1032 const auto val = State->getRawSVal(*loc); in handleRandomIncrOrDecr()
1037 State = in handleRandomIncrOrDecr()
1038 setIteratorPosition(State, TgtVal, advancePosition(C, Op, *Pos, *value)); in handleRandomIncrOrDecr()
1039 C.addTransition(State); in handleRandomIncrOrDecr()
1060 auto State = C.getState(); in verifyRandomIncrOrDecr() local
1063 const auto *Pos = getIteratorPosition(State, LHS); in verifyRandomIncrOrDecr()
1069 Value = State->getRawSVal(*ValAsLoc); in verifyRandomIncrOrDecr()
1076 if (isZero(State, Value.castAs<NonLoc>())) in verifyRandomIncrOrDecr()
1081 if (isAheadOfRange(State, advancePosition(C, Op, *Pos, Value))) { in verifyRandomIncrOrDecr()
1082 auto *N = C.generateNonFatalErrorNode(State); in verifyRandomIncrOrDecr()
1088 if (isBehindPastTheEnd(State, advancePosition(C, Op, *Pos, Value))) { in verifyRandomIncrOrDecr()
1089 auto *N = C.generateNonFatalErrorNode(State); in verifyRandomIncrOrDecr()
1102 auto State = C.getState(); in verifyMatch() local
1103 const auto *Pos = getIteratorPosition(State, Iter); in verifyMatch()
1105 auto *N = C.generateNonFatalErrorNode(State); in verifyMatch()
1116 auto State = C.getState(); in verifyMatch() local
1117 const auto *Pos1 = getIteratorPosition(State, Iter1); in verifyMatch()
1118 const auto *Pos2 = getIteratorPosition(State, Iter2); in verifyMatch()
1120 auto *N = C.generateNonFatalErrorNode(State); in verifyMatch()
1138 auto State = C.getState(); in handleBegin() local
1139 auto BeginSym = getContainerBegin(State, ContReg); in handleBegin()
1144 State = assumeNoOverflow(State, BeginSym, 4); in handleBegin()
1145 State = createContainerBegin(State, ContReg, BeginSym); in handleBegin()
1147 State = setIteratorPosition(State, RetVal, in handleBegin()
1149 C.addTransition(State); in handleBegin()
1162 auto State = C.getState(); in handleEnd() local
1163 auto EndSym = getContainerEnd(State, ContReg); in handleEnd()
1168 State = assumeNoOverflow(State, EndSym, 4); in handleEnd()
1169 State = createContainerEnd(State, ContReg, EndSym); in handleEnd()
1171 State = setIteratorPosition(State, RetVal, in handleEnd()
1173 C.addTransition(State); in handleEnd()
1181 auto State = C.getState(); in assignToContainer() local
1185 State = assumeNoOverflow(State, Sym, 4); in assignToContainer()
1186 State = setIteratorPosition(State, RetVal, in assignToContainer()
1188 C.addTransition(State); in assignToContainer()
1201 auto State = C.getState(); in handleAssign() local
1202 const auto CData = getContainerData(State, ContReg); in handleAssign()
1204 State = invalidateAllIteratorPositions(State, ContReg); in handleAssign()
1213 const auto OldCData = getContainerData(State, OldContReg); in handleAssign()
1220 State = reassignAllIteratorPositionsUnless(State, OldContReg, ContReg, in handleAssign()
1228 State = assumeNoOverflow(State, NewEndSym, 4); in handleAssign()
1230 State = setContainerData(State, ContReg, CData->newEnd(NewEndSym)); in handleAssign()
1232 State = setContainerData(State, ContReg, in handleAssign()
1237 State = rebaseSymbolInIteratorPositionsIf( in handleAssign()
1238 State, SVB, OldEndSym, NewEndSym, OldEndSym, BO_LT); in handleAssign()
1242 State = reassignAllIteratorPositions(State, OldContReg, ContReg); in handleAssign()
1248 State = in handleAssign()
1249 setContainerData(State, ContReg, CData->newBegin(OldBeginSym)); in handleAssign()
1251 State = setContainerData(State, ContReg, in handleAssign()
1254 State = in handleAssign()
1255 setContainerData(State, OldContReg, OldCData->newEnd(nullptr)); in handleAssign()
1260 State = reassignAllIteratorPositions(State, OldContReg, ContReg); in handleAssign()
1264 C.addTransition(State); in handleAssign()
1276 auto State = C.getState(); in handleClear() local
1277 if (!hasSubscriptOperator(State, ContReg) || in handleClear()
1278 !backModifiable(State, ContReg)) { in handleClear()
1279 const auto CData = getContainerData(State, ContReg); in handleClear()
1282 State = in handleClear()
1283 invalidateAllIteratorPositionsExcept(State, ContReg, EndSym, BO_GE); in handleClear()
1284 C.addTransition(State); in handleClear()
1289 State = invalidateAllIteratorPositions(State, ContReg); in handleClear()
1290 C.addTransition(State); in handleClear()
1302 auto State = C.getState(); in handlePushBack() local
1303 if (hasSubscriptOperator(State, ContReg) && frontModifiable(State, ContReg)) { in handlePushBack()
1304 State = invalidateAllIteratorPositions(State, ContReg); in handlePushBack()
1305 C.addTransition(State); in handlePushBack()
1309 const auto CData = getContainerData(State, ContReg); in handlePushBack()
1315 if (hasSubscriptOperator(State, ContReg)) { in handlePushBack()
1316 State = invalidateIteratorPositions(State, EndSym, BO_GE); in handlePushBack()
1322 SVB.evalBinOp(State, BO_Add, in handlePushBack()
1326 State = setContainerData(State, ContReg, CData->newEnd(newEndSym)); in handlePushBack()
1328 C.addTransition(State); in handlePushBack()
1338 auto State = C.getState(); in handlePopBack() local
1339 const auto CData = getContainerData(State, ContReg); in handlePopBack()
1348 SVB.evalBinOp(State, BO_Sub, in handlePopBack()
1355 if (hasSubscriptOperator(State, ContReg) && in handlePopBack()
1356 backModifiable(State, ContReg)) { in handlePopBack()
1357 State = invalidateIteratorPositions(State, BackSym, BO_GE); in handlePopBack()
1358 State = setContainerData(State, ContReg, CData->newEnd(nullptr)); in handlePopBack()
1360 State = invalidateIteratorPositions(State, BackSym, BO_EQ); in handlePopBack()
1363 State = setContainerData(State, ContReg, CData->newEnd(newEndSym)); in handlePopBack()
1364 C.addTransition(State); in handlePopBack()
1377 auto State = C.getState(); in handlePushFront() local
1378 if (hasSubscriptOperator(State, ContReg)) { in handlePushFront()
1379 State = invalidateAllIteratorPositions(State, ContReg); in handlePushFront()
1380 C.addTransition(State); in handlePushFront()
1382 const auto CData = getContainerData(State, ContReg); in handlePushFront()
1391 SVB.evalBinOp(State, BO_Sub, in handlePushFront()
1395 State = setContainerData(State, ContReg, CData->newBegin(newBeginSym)); in handlePushFront()
1396 C.addTransition(State); in handlePushFront()
1409 auto State = C.getState(); in handlePopFront() local
1410 const auto CData = getContainerData(State, ContReg); in handlePopFront()
1417 if (hasSubscriptOperator(State, ContReg)) { in handlePopFront()
1418 State = invalidateIteratorPositions(State, BeginSym, BO_LE); in handlePopFront()
1420 State = invalidateIteratorPositions(State, BeginSym, BO_EQ); in handlePopFront()
1426 SVB.evalBinOp(State, BO_Add, in handlePopFront()
1430 State = setContainerData(State, ContReg, CData->newBegin(newBeginSym)); in handlePopFront()
1431 C.addTransition(State); in handlePopFront()
1436 auto State = C.getState(); in handleInsert() local
1437 const auto *Pos = getIteratorPosition(State, Iter); in handleInsert()
1444 if (hasSubscriptOperator(State, Cont) && backModifiable(State, Cont)) { in handleInsert()
1445 if (frontModifiable(State, Cont)) { in handleInsert()
1446 State = invalidateAllIteratorPositions(State, Cont); in handleInsert()
1448 State = invalidateIteratorPositions(State, Pos->getOffset(), BO_GE); in handleInsert()
1450 if (const auto *CData = getContainerData(State, Cont)) { in handleInsert()
1452 State = invalidateIteratorPositions(State, EndSym, BO_GE); in handleInsert()
1453 State = setContainerData(State, Cont, CData->newEnd(nullptr)); in handleInsert()
1456 C.addTransition(State); in handleInsert()
1461 auto State = C.getState(); in handleErase() local
1462 const auto *Pos = getIteratorPosition(State, Iter); in handleErase()
1470 if (hasSubscriptOperator(State, Cont) && backModifiable(State, Cont)) { in handleErase()
1471 if (frontModifiable(State, Cont)) { in handleErase()
1472 State = invalidateAllIteratorPositions(State, Cont); in handleErase()
1474 State = invalidateIteratorPositions(State, Pos->getOffset(), BO_GE); in handleErase()
1476 if (const auto *CData = getContainerData(State, Cont)) { in handleErase()
1478 State = invalidateIteratorPositions(State, EndSym, BO_GE); in handleErase()
1479 State = setContainerData(State, Cont, CData->newEnd(nullptr)); in handleErase()
1483 State = invalidateIteratorPositions(State, Pos->getOffset(), BO_EQ); in handleErase()
1485 C.addTransition(State); in handleErase()
1490 auto State = C.getState(); in handleErase() local
1491 const auto *Pos1 = getIteratorPosition(State, Iter1); in handleErase()
1492 const auto *Pos2 = getIteratorPosition(State, Iter2); in handleErase()
1501 if (hasSubscriptOperator(State, Cont) && backModifiable(State, Cont)) { in handleErase()
1502 if (frontModifiable(State, Cont)) { in handleErase()
1503 State = invalidateAllIteratorPositions(State, Cont); in handleErase()
1505 State = invalidateIteratorPositions(State, Pos1->getOffset(), BO_GE); in handleErase()
1507 if (const auto *CData = getContainerData(State, Cont)) { in handleErase()
1509 State = invalidateIteratorPositions(State, EndSym, BO_GE); in handleErase()
1510 State = setContainerData(State, Cont, CData->newEnd(nullptr)); in handleErase()
1514 State = invalidateIteratorPositions(State, Pos1->getOffset(), BO_GE, in handleErase()
1517 C.addTransition(State); in handleErase()
1522 auto State = C.getState(); in handleEraseAfter() local
1523 const auto *Pos = getIteratorPosition(State, Iter); in handleEraseAfter()
1533 SVB.evalBinOp(State, BO_Add, in handleEraseAfter()
1537 State = invalidateIteratorPositions(State, NextSym, BO_EQ); in handleEraseAfter()
1538 C.addTransition(State); in handleEraseAfter()
1543 auto State = C.getState(); in handleEraseAfter() local
1544 const auto *Pos1 = getIteratorPosition(State, Iter1); in handleEraseAfter()
1545 const auto *Pos2 = getIteratorPosition(State, Iter2); in handleEraseAfter()
1550 State = invalidateIteratorPositions(State, Pos1->getOffset(), BO_GT, in handleEraseAfter()
1552 C.addTransition(State); in handleEraseAfter()
1559 auto State = C.getState(); in advancePosition() local
1569 return Pos.setTo(SVB.evalBinOp(State, BinOp, in advancePosition()
1579 State = assumeNoOverflow(State, NewPosSym, 4); in advancePosition()
1622 bool isLess(ProgramStateRef State, SymbolRef Sym1, SymbolRef Sym2);
1623 bool isGreater(ProgramStateRef State, SymbolRef Sym1, SymbolRef Sym2);
1624 bool isEqual(ProgramStateRef State, SymbolRef Sym1, SymbolRef Sym2);
1625 bool compare(ProgramStateRef State, SymbolRef Sym1, SymbolRef Sym2,
1627 bool compare(ProgramStateRef State, NonLoc NL1, NonLoc NL2,
1629 const CXXRecordDecl *getCXXRecordDecl(ProgramStateRef State,
1631 SymbolRef rebaseSymbol(ProgramStateRef State, SValBuilder &SVB, SymbolRef Expr,
1873 bool hasSubscriptOperator(ProgramStateRef State, const MemRegion *Reg) { in hasSubscriptOperator() argument
1874 const auto *CRD = getCXXRecordDecl(State, Reg); in hasSubscriptOperator()
1889 bool frontModifiable(ProgramStateRef State, const MemRegion *Reg) { in frontModifiable() argument
1890 const auto *CRD = getCXXRecordDecl(State, Reg); in frontModifiable()
1904 bool backModifiable(ProgramStateRef State, const MemRegion *Reg) { in backModifiable() argument
1905 const auto *CRD = getCXXRecordDecl(State, Reg); in backModifiable()
1919 const CXXRecordDecl *getCXXRecordDecl(ProgramStateRef State, in getCXXRecordDecl() argument
1921 auto TI = getDynamicTypeInfo(State, Reg); in getCXXRecordDecl()
1944 const ProgramStateRef processComparison(ProgramStateRef State, in processComparison() argument
1947 const auto *LPos = getIteratorPosition(State, LVal); in processComparison()
1948 const auto *RPos = getIteratorPosition(State, RVal); in processComparison()
1950 State = adjustIteratorPosition(State, RVal, *LPos, Equal); in processComparison()
1952 State = adjustIteratorPosition(State, LVal, *RPos, Equal); in processComparison()
1954 State = relateIteratorPositions(State, *LPos, *RPos, Equal); in processComparison()
1956 return State; in processComparison()
1959 const ProgramStateRef saveComparison(ProgramStateRef State, in saveComparison() argument
1965 return State; in saveComparison()
1966 return State->set<IteratorComparisonMap>(Condition, in saveComparison()
1970 const IteratorComparison *loadComparison(ProgramStateRef State, in loadComparison() argument
1972 return State->get<IteratorComparisonMap>(Condition); in loadComparison()
1975 SymbolRef getContainerBegin(ProgramStateRef State, const MemRegion *Cont) { in getContainerBegin() argument
1976 const auto *CDataPtr = getContainerData(State, Cont); in getContainerBegin()
1983 SymbolRef getContainerEnd(ProgramStateRef State, const MemRegion *Cont) { in getContainerEnd() argument
1984 const auto *CDataPtr = getContainerData(State, Cont); in getContainerEnd()
1991 ProgramStateRef createContainerBegin(ProgramStateRef State, in createContainerBegin() argument
1995 const auto *CDataPtr = getContainerData(State, Cont); in createContainerBegin()
1998 return State; in createContainerBegin()
2001 return setContainerData(State, Cont, CData); in createContainerBegin()
2004 return setContainerData(State, Cont, CData); in createContainerBegin()
2007 ProgramStateRef createContainerEnd(ProgramStateRef State, const MemRegion *Cont, in createContainerEnd() argument
2010 const auto *CDataPtr = getContainerData(State, Cont); in createContainerEnd()
2013 return State; in createContainerEnd()
2016 return setContainerData(State, Cont, CData); in createContainerEnd()
2019 return setContainerData(State, Cont, CData); in createContainerEnd()
2022 const ContainerData *getContainerData(ProgramStateRef State, in getContainerData() argument
2024 return State->get<ContainerMap>(Cont); in getContainerData()
2027 ProgramStateRef setContainerData(ProgramStateRef State, const MemRegion *Cont, in setContainerData() argument
2029 return State->set<ContainerMap>(Cont, CData); in setContainerData()
2032 const IteratorPosition *getIteratorPosition(ProgramStateRef State, in getIteratorPosition() argument
2036 return State->get<IteratorRegionMap>(Reg); in getIteratorPosition()
2038 return State->get<IteratorSymbolMap>(Sym); in getIteratorPosition()
2040 return State->get<IteratorRegionMap>(LCVal->getRegion()); in getIteratorPosition()
2045 const IteratorPosition *getIteratorPosition(ProgramStateRef State, in getIteratorPosition() argument
2049 return State->get<IteratorRegionMap>(Reg); in getIteratorPosition()
2051 return State->get<IteratorSymbolMap>(RegOrSym.get<SymbolRef>()); in getIteratorPosition()
2056 ProgramStateRef setIteratorPosition(ProgramStateRef State, const SVal &Val, in setIteratorPosition() argument
2060 return State->set<IteratorRegionMap>(Reg, Pos); in setIteratorPosition()
2062 return State->set<IteratorSymbolMap>(Sym, Pos); in setIteratorPosition()
2064 return State->set<IteratorRegionMap>(LCVal->getRegion(), Pos); in setIteratorPosition()
2069 ProgramStateRef setIteratorPosition(ProgramStateRef State, in setIteratorPosition() argument
2074 return State->set<IteratorRegionMap>(Reg, Pos); in setIteratorPosition()
2076 return State->set<IteratorSymbolMap>(RegOrSym.get<SymbolRef>(), Pos); in setIteratorPosition()
2081 ProgramStateRef removeIteratorPosition(ProgramStateRef State, const SVal &Val) { in removeIteratorPosition() argument
2084 return State->remove<IteratorRegionMap>(Reg); in removeIteratorPosition()
2086 return State->remove<IteratorSymbolMap>(Sym); in removeIteratorPosition()
2088 return State->remove<IteratorRegionMap>(LCVal->getRegion()); in removeIteratorPosition()
2093 ProgramStateRef adjustIteratorPosition(ProgramStateRef State, in adjustIteratorPosition() argument
2098 return setIteratorPosition(State, RegOrSym, Pos); in adjustIteratorPosition()
2100 return State; in adjustIteratorPosition()
2104 ProgramStateRef relateIteratorPositions(ProgramStateRef State, in relateIteratorPositions() argument
2108 auto &SVB = State->getStateManager().getSValBuilder(); in relateIteratorPositions()
2116 SVB.evalBinOp(State, BO_EQ, nonloc::SymbolVal(Pos1.getOffset()), in relateIteratorPositions()
2123 auto NewState = State->assume(comparison.castAs<DefinedSVal>(), Equal); in relateIteratorPositions()
2136 bool hasLiveIterators(ProgramStateRef State, const MemRegion *Cont) { in hasLiveIterators() argument
2137 auto RegionMap = State->get<IteratorRegionMap>(); in hasLiveIterators()
2143 auto SymbolMap = State->get<IteratorSymbolMap>(); in hasLiveIterators()
2165 ProgramStateRef processIteratorPositions(ProgramStateRef State, Condition Cond, in processIteratorPositions() argument
2167 auto &RegionMapFactory = State->get_context<IteratorRegionMap>(); in processIteratorPositions()
2168 auto RegionMap = State->get<IteratorRegionMap>(); in processIteratorPositions()
2178 State = State->set<IteratorRegionMap>(RegionMap); in processIteratorPositions()
2180 auto &SymbolMapFactory = State->get_context<IteratorSymbolMap>(); in processIteratorPositions()
2181 auto SymbolMap = State->get<IteratorSymbolMap>(); in processIteratorPositions()
2191 State = State->set<IteratorSymbolMap>(SymbolMap); in processIteratorPositions()
2193 return State; in processIteratorPositions()
2196 ProgramStateRef invalidateAllIteratorPositions(ProgramStateRef State, in invalidateAllIteratorPositions() argument
2204 return processIteratorPositions(State, MatchCont, Invalidate); in invalidateAllIteratorPositions()
2208 invalidateAllIteratorPositionsExcept(ProgramStateRef State, in invalidateAllIteratorPositionsExcept() argument
2213 !compare(State, Pos.getOffset(), Offset, Opc); in invalidateAllIteratorPositionsExcept()
2218 return processIteratorPositions(State, MatchContAndCompare, Invalidate); in invalidateAllIteratorPositionsExcept()
2221 ProgramStateRef invalidateIteratorPositions(ProgramStateRef State, in invalidateIteratorPositions() argument
2225 return compare(State, Pos.getOffset(), Offset, Opc); in invalidateIteratorPositions()
2230 return processIteratorPositions(State, Compare, Invalidate); in invalidateIteratorPositions()
2233 ProgramStateRef invalidateIteratorPositions(ProgramStateRef State, in invalidateIteratorPositions() argument
2239 return compare(State, Pos.getOffset(), Offset1, Opc1) && in invalidateIteratorPositions()
2240 compare(State, Pos.getOffset(), Offset2, Opc2); in invalidateIteratorPositions()
2245 return processIteratorPositions(State, Compare, Invalidate); in invalidateIteratorPositions()
2248 ProgramStateRef reassignAllIteratorPositions(ProgramStateRef State, in reassignAllIteratorPositions() argument
2257 return processIteratorPositions(State, MatchCont, ReAssign); in reassignAllIteratorPositions()
2260 ProgramStateRef reassignAllIteratorPositionsUnless(ProgramStateRef State, in reassignAllIteratorPositionsUnless() argument
2267 !compare(State, Pos.getOffset(), Offset, Opc); in reassignAllIteratorPositionsUnless()
2272 return processIteratorPositions(State, MatchContAndCompare, ReAssign); in reassignAllIteratorPositionsUnless()
2279 ProgramStateRef State, SValBuilder &SVB, SymbolRef OldSym, in rebaseSymbolInIteratorPositionsIf() argument
2282 return compare(State, Pos.getOffset(), CondSym, Opc); in rebaseSymbolInIteratorPositionsIf()
2285 return Pos.setTo(rebaseSymbol(State, SVB, Pos.getOffset(), OldSym, in rebaseSymbolInIteratorPositionsIf()
2288 return processIteratorPositions(State, LessThanEnd, RebaseSymbol); in rebaseSymbolInIteratorPositionsIf()
2294 SymbolRef rebaseSymbol(ProgramStateRef State, SValBuilder &SVB, in rebaseSymbol() argument
2298 auto Diff = SVB.evalBinOpNN(State, BO_Sub, nonloc::SymbolVal(OrigExpr), in rebaseSymbol()
2306 return SVB.evalBinOpNN(State, BO_Add, *DiffInt, nonloc::SymbolVal(NewSym), in rebaseSymbol()
2310 bool isZero(ProgramStateRef State, const NonLoc &Val) { in isZero() argument
2311 auto &BVF = State->getBasicVals(); in isZero()
2312 return compare(State, Val, in isZero()
2317 bool isPastTheEnd(ProgramStateRef State, const IteratorPosition &Pos) { in isPastTheEnd() argument
2319 const auto *CData = getContainerData(State, Cont); in isPastTheEnd()
2325 if (isEqual(State, Pos.getOffset(), End)) { in isPastTheEnd()
2333 bool isAheadOfRange(ProgramStateRef State, const IteratorPosition &Pos) { in isAheadOfRange() argument
2335 const auto *CData = getContainerData(State, Cont); in isAheadOfRange()
2341 if (isLess(State, Pos.getOffset(), Beg)) { in isAheadOfRange()
2349 bool isBehindPastTheEnd(ProgramStateRef State, const IteratorPosition &Pos) { in isBehindPastTheEnd() argument
2351 const auto *CData = getContainerData(State, Cont); in isBehindPastTheEnd()
2357 if (isGreater(State, Pos.getOffset(), End)) { in isBehindPastTheEnd()
2365 bool isLess(ProgramStateRef State, SymbolRef Sym1, SymbolRef Sym2) { in isLess() argument
2366 return compare(State, Sym1, Sym2, BO_LT); in isLess()
2369 bool isGreater(ProgramStateRef State, SymbolRef Sym1, SymbolRef Sym2) { in isGreater() argument
2370 return compare(State, Sym1, Sym2, BO_GT); in isGreater()
2373 bool isEqual(ProgramStateRef State, SymbolRef Sym1, SymbolRef Sym2) { in isEqual() argument
2374 return compare(State, Sym1, Sym2, BO_EQ); in isEqual()
2377 bool compare(ProgramStateRef State, SymbolRef Sym1, SymbolRef Sym2, in compare() argument
2379 return compare(State, nonloc::SymbolVal(Sym1), nonloc::SymbolVal(Sym2), Opc); in compare()
2383 bool compare(ProgramStateRef State, NonLoc NL1, NonLoc NL2, in compare() argument
2385 auto &SVB = State->getStateManager().getSValBuilder(); in compare()
2388 SVB.evalBinOp(State, Opc, NL1, NL2, SVB.getConditionType()); in compare()
2393 return !State->assume(comparison.castAs<DefinedSVal>(), false); in compare()