diff options
author | Martin Nowack <m.nowack@imperial.ac.uk> | 2019-04-01 14:08:43 +0100 |
---|---|---|
committer | Cristian Cadar <c.cadar@imperial.ac.uk> | 2020-07-01 15:52:40 +0100 |
commit | 8a0f1af7500e10dadd97300f242424917d2e9902 (patch) | |
tree | 48d86b5a1dca9513e4bd1ba8a96441adc0be5169 /lib/Core/SeedInfo.cpp | |
parent | da5d238b5a78b54f89728132d71cfa6f8be16d21 (diff) | |
download | klee-8a0f1af7500e10dadd97300f242424917d2e9902.tar.gz |
Use constraint sets and separate metadata for timing solver invocation
Decouple ExecutionState from TimingSolver Instead of providing an execution state to the timing solver use a set of constraints and an additional object for metadata. Fixes: * correct accounting of metadata to a specific state * accounting of all solver invocations (e.g. solver-getRange was not accounted) * allows to invoke the solver without a state (avoids costly copying of states/constraints)
Diffstat (limited to 'lib/Core/SeedInfo.cpp')
-rw-r--r-- | lib/Core/SeedInfo.cpp | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/lib/Core/SeedInfo.cpp b/lib/Core/SeedInfo.cpp index d3688313..55f4ed48 100644 --- a/lib/Core/SeedInfo.cpp +++ b/lib/Core/SeedInfo.cpp @@ -62,10 +62,9 @@ KTestObject *SeedInfo::getNextInput(const MemoryObject *mo, void SeedInfo::patchSeed(const ExecutionState &state, ref<Expr> condition, TimingSolver *solver) { - std::vector< ref<Expr> > required(state.constraints.begin(), - state.constraints.end()); - ExecutionState tmp(required); - tmp.addConstraint(condition); + ConstraintSet required(state.constraints); + ConstraintManager cm(required); + cm.addConstraint(condition); // Try and patch direct reads first, this is likely to resolve the // problem quickly and avoids long traversal of all seed @@ -98,26 +97,29 @@ void SeedInfo::patchSeed(const ExecutionState &state, ConstantExpr::alloc(it2->second[i], Expr::Int8)); bool res; - bool success = solver->mustBeFalse(tmp, isSeed, res); + bool success = + solver->mustBeFalse(required, isSeed, res, state.queryMetaData); assert(success && "FIXME: Unhandled solver failure"); (void) success; if (res) { ref<ConstantExpr> value; - bool success = solver->getValue(tmp, read, value); + bool success = + solver->getValue(required, read, value, state.queryMetaData); assert(success && "FIXME: Unhandled solver failure"); (void) success; it2->second[i] = value->getZExtValue(8); - tmp.addConstraint(EqExpr::create(read, - ConstantExpr::alloc(it2->second[i], - Expr::Int8))); + cm.addConstraint(EqExpr::create( + read, ConstantExpr::alloc(it2->second[i], Expr::Int8))); } else { - tmp.addConstraint(isSeed); + cm.addConstraint(isSeed); } } } bool res; - bool success = solver->mayBeTrue(state, assignment.evaluate(condition), res); + bool success = + solver->mayBeTrue(state.constraints, assignment.evaluate(condition), res, + state.queryMetaData); assert(success && "FIXME: Unhandled solver failure"); (void) success; if (res) @@ -135,20 +137,21 @@ void SeedInfo::patchSeed(const ExecutionState &state, ConstantExpr::alloc(it->second[i], Expr::Int8)); bool res; - bool success = solver->mustBeFalse(tmp, isSeed, res); + bool success = + solver->mustBeFalse(required, isSeed, res, state.queryMetaData); assert(success && "FIXME: Unhandled solver failure"); (void) success; if (res) { ref<ConstantExpr> value; - bool success = solver->getValue(tmp, read, value); + bool success = + solver->getValue(required, read, value, state.queryMetaData); assert(success && "FIXME: Unhandled solver failure"); (void) success; it->second[i] = value->getZExtValue(8); - tmp.addConstraint(EqExpr::create(read, - ConstantExpr::alloc(it->second[i], - Expr::Int8))); + cm.addConstraint(EqExpr::create( + read, ConstantExpr::alloc(it->second[i], Expr::Int8))); } else { - tmp.addConstraint(isSeed); + cm.addConstraint(isSeed); } } } @@ -156,8 +159,9 @@ void SeedInfo::patchSeed(const ExecutionState &state, #ifndef NDEBUG { bool res; - bool success = - solver->mayBeTrue(state, assignment.evaluate(condition), res); + bool success = + solver->mayBeTrue(state.constraints, assignment.evaluate(condition), + res, state.queryMetaData); assert(success && "FIXME: Unhandled solver failure"); (void) success; assert(res && "seed patching failed"); |