@@ -1270,9 +1270,11 @@ void Executor::branch(ExecutionState &state,
12701270 }
12711271 }
12721272
1273- std::map<ExecutionState *, std::vector<ExecutingSeed>>::iterator it =
1274- seedMap->find (&state);
1275- if (it != seedMap->end ()) {
1273+ if (state.isSeeded ) {
1274+ std::map<ExecutionState *, std::vector<ExecutingSeed>>::iterator it =
1275+ seedMap->find (&state);
1276+ assert (it != seedMap->end ());
1277+ assert (!it->second .empty ());
12761278 std::vector<ExecutingSeed> seeds = it->second ;
12771279 seedMap->erase (it);
12781280 objectManager->unseed (it->first );
@@ -1410,11 +1412,8 @@ Executor::StatePair Executor::fork(ExecutionState ¤t, ref<Expr> condition,
14101412 KBlock *ifTrueBlock, KBlock *ifFalseBlock,
14111413 BranchType reason) {
14121414 bool isInternal = ifTrueBlock == ifFalseBlock;
1413- std::map<ExecutionState *, std::vector<ExecutingSeed>>::iterator it =
1414- seedMap->find (¤t);
1415- bool isSeeding = it != seedMap->end ();
14161415 PartialValidity res = PartialValidity::None;
1417-
1416+ bool isSeeding = current. isSeeded ;
14181417 std::vector<ExecutingSeed> trueSeeds;
14191418 std::vector<ExecutingSeed> falseSeeds;
14201419 time::Span timeout = coreSolverTimeout;
@@ -1438,7 +1437,11 @@ Executor::StatePair Executor::fork(ExecutionState ¤t, ref<Expr> condition,
14381437 addConstraint (current, Expr::createIsZero (condition));
14391438 }
14401439 }
1441- } else if (!it->second .empty ()) {
1440+ } else {
1441+ std::map<ExecutionState *, std::vector<ExecutingSeed>>::iterator it =
1442+ seedMap->find (¤t);
1443+ assert (it != seedMap->end ());
1444+ assert (!it->second .empty ());
14421445 timeout *= static_cast <unsigned >(it->second .size ());
14431446 for (std::vector<ExecutingSeed>::iterator siit = it->second .begin (),
14441447 siie = it->second .end ();
@@ -1646,9 +1649,11 @@ void Executor::addConstraint(ExecutionState &state, ref<Expr> condition) {
16461649 }
16471650
16481651 // Check to see if this constraint violates seeds.
1649- std::map<ExecutionState *, std::vector<ExecutingSeed>>::iterator it =
1650- seedMap->find (&state);
1651- if (PatchSeeds && it != seedMap->end ()) {
1652+ if (PatchSeeds && state.isSeeded ) {
1653+ std::map<ExecutionState *, std::vector<ExecutingSeed>>::iterator it =
1654+ seedMap->find (&state);
1655+ assert (it != seedMap->end ());
1656+ assert (!it->second .empty ());
16521657 bool warn = false ;
16531658 for (std::vector<ExecutingSeed>::iterator siit = it->second .begin (),
16541659 siie = it->second .end ();
@@ -1796,10 +1801,7 @@ Executor::toConstantPointer(ExecutionState &state, ref<PointerExpr> e,
17961801void Executor::executeGetValue (ExecutionState &state, ref<Expr> e,
17971802 KInstruction *target) {
17981803 e = Simplificator::simplifyExpr (state.constraints .cs (), e).simplified ;
1799- std::map<ExecutionState *, std::vector<ExecutingSeed>>::iterator it =
1800- seedMap->find (&state);
1801- if (it == seedMap->end () || isa<ConstantExpr>(e) ||
1802- isa<ConstantPointerExpr>(e)) {
1804+ if (!state.isSeeded || isa<ConstantExpr>(e) || isa<ConstantPointerExpr>(e)) {
18031805 ref<Expr> value;
18041806 e = optimizer.optimizeExpr (e, true );
18051807 bool success =
@@ -1808,6 +1810,10 @@ void Executor::executeGetValue(ExecutionState &state, ref<Expr> e,
18081810 (void )success;
18091811 bindLocal (target, state, value);
18101812 } else {
1813+ std::map<ExecutionState *, std::vector<ExecutingSeed>>::iterator it =
1814+ seedMap->find (&state);
1815+ assert (it != seedMap->end ());
1816+ assert (!it->second .empty ());
18111817 std::set<ref<Expr>> values;
18121818 for (std::vector<ExecutingSeed>::iterator siit = it->second .begin (),
18131819 siie = it->second .end ();
@@ -4497,7 +4503,8 @@ Executor::MemoryUsage Executor::checkMemoryUsage() {
44974503 arr.push_back (state);
44984504 }
44994505 }
4500- auto toKill = std::min (arr.size (), numStates - numStates * MaxMemory / totalUsage);
4506+ auto toKill =
4507+ std::min (arr.size (), numStates - numStates * MaxMemory / totalUsage);
45014508
45024509 if (toKill != 0 ) {
45034510 klee_warning (" killing %lu states (over memory cap: %luMB)" , toKill,
@@ -4670,16 +4677,22 @@ void Executor::initialSeed(ExecutionState &initialState,
46704677 objectManager->updateSubscribers ();
46714678}
46724679
4673- ExecutingSeed Executor::storeState (const ExecutionState &state,
4674- bool isCompleted) {
4675- KTest *ktest = 0 ;
4676- ktest = (KTest *)calloc (1 , sizeof (*ktest));
4677- bool success = getSymbolicSolution (state, ktest);
4678- if (!success)
4680+ bool Executor::storeState (const ExecutionState &state, bool isCompleted,
4681+ ExecutingSeed &res) {
4682+ solver->setTimeout (coreSolverTimeout);
4683+ auto arrays = state.constraints .cs ().gatherArrays ();
4684+ std::vector<SparseStorageImpl<unsigned char >> values;
4685+ bool success = solver->getInitialValues (state.constraints .cs (), arrays,
4686+ values, state.queryMetaData );
4687+ if (!success) {
46794688 klee_warning (" unable to get symbolic solution, losing test case" );
4680- ExecutingSeed seed (ktest, state.steppedInstructions , isCompleted,
4689+ return false ;
4690+ }
4691+ Assignment assignment (arrays, values);
4692+ ExecutingSeed seed (assignment, state.steppedInstructions , isCompleted,
46814693 state.coveredNew , state.coveredNewError );
4682- return seed;
4694+ res = seed;
4695+ return true ;
46834696}
46844697
46854698void Executor::reportProgressTowardsTargets (std::string prefix,
@@ -5063,8 +5076,11 @@ void Executor::terminateStateEarly(ExecutionState &state, const Twine &message,
50635076 (AlwaysOutputSeeds && seedMap->count (&state))) {
50645077 state.clearCoveredNew ();
50655078 if (StoreSeedsLocally) {
5066- storedSeeds->push_back (
5067- storeState (state, !(reason <= StateTerminationType::EARLY)));
5079+ ExecutingSeed seed;
5080+ bool success = storeState (state, !(reason <= StateTerminationType::EARLY), seed);
5081+ if (success) {
5082+ storedSeeds->push_back (seed);
5083+ }
50685084 } else {
50695085 interpreterHandler->processTestCase (
50705086 state, (message + " \n " ).str ().c_str (),
@@ -6899,17 +6915,22 @@ void Executor::executeMakeSymbolic(ExecutionState &state,
68996915 }
69006916 state.addSymbolic (mo, array, type);
69016917
6902- std::map<ExecutionState *, std::vector<ExecutingSeed>>::iterator it =
6903- seedMap->find (&state);
6904- if (it != seedMap->end ()) { // In seed mode we need to add this as a
6905- // binding.
6918+ if (state.isSeeded ) { // In seed mode we need to add this as a
6919+ // binding.
6920+ std::map<ExecutionState *, std::vector<ExecutingSeed>>::iterator it =
6921+ seedMap->find (&state);
6922+ assert (it != seedMap->end ());
6923+ assert (!it->second .empty ());
69066924 for (std::vector<ExecutingSeed>::iterator siit = it->second .begin (),
69076925 siie = it->second .end ();
69086926 siit != siie; ++siit) {
69096927 ExecutingSeed &si = *siit;
69106928 KTestObject *obj = si.getNextInput (mo, NamedSeedMatching);
69116929
69126930 if (!obj) {
6931+ if (si.assignment .bindings .count (array) != 0 ) {
6932+ continue ;
6933+ }
69136934 if (ZeroSeedExtension) {
69146935 si.assignment .bindings .replace (
69156936 {array, SparseStorageImpl<unsigned char >(0 )});
0 commit comments