@@ -543,8 +543,10 @@ Executor::Executor(LLVMContext &ctx, const InterpreterOptions &opts,
543
543
}
544
544
545
545
coreSolverTimeout = time ::Span{MaxCoreSolverTime};
546
- if (coreSolverTimeout)
546
+ if (coreSolverTimeout) {
547
547
UseForkedCoreSolver = true ;
548
+ }
549
+ coreSolverMemoryLimit = MaxCoreSolverMemory;
548
550
std::unique_ptr<Solver> coreSolver = klee::createCoreSolver (CoreSolverToUse);
549
551
if (!coreSolver) {
550
552
klee_error (" Failed to create core solver\n " );
@@ -1358,16 +1360,18 @@ Executor::StatePair Executor::fork(ExecutionState ¤t, ref<Expr> condition,
1358
1360
condition = maxStaticPctChecks (current, condition);
1359
1361
1360
1362
time ::Span timeout = coreSolverTimeout;
1363
+ unsigned memoryLimit = coreSolverMemoryLimit;
1361
1364
if (isSeeding)
1362
1365
timeout *= static_cast <unsigned >(it->second .size ());
1363
- solver->setTimeout (timeout);
1366
+ solver->setLimits (timeout, memoryLimit );
1364
1367
1365
1368
bool shouldCheckTrueBlock = true , shouldCheckFalseBlock = true ;
1366
1369
if (!isInternal) {
1367
1370
shouldCheckTrueBlock = canReachSomeTargetFromBlock (current, ifTrueBlock);
1368
1371
shouldCheckFalseBlock = canReachSomeTargetFromBlock (current, ifFalseBlock);
1369
1372
}
1370
1373
PartialValidity res = PartialValidity::None;
1374
+
1371
1375
bool terminateEverything = false , success = true ;
1372
1376
if (!shouldCheckTrueBlock) {
1373
1377
bool mayBeFalse = false ;
@@ -1402,7 +1406,7 @@ Executor::StatePair Executor::fork(ExecutionState ¤t, ref<Expr> condition,
1402
1406
success = solver->evaluate (current.constraints .cs (), condition, res,
1403
1407
current.queryMetaData );
1404
1408
}
1405
- solver->setTimeout (time ::Span ());
1409
+ solver->setLimits (time ::Span (), 0 );
1406
1410
if (!success) {
1407
1411
current.pc = current.prevPC ;
1408
1412
terminateStateOnSolverError (current, " Query timed out (fork)." );
@@ -1614,11 +1618,11 @@ void Executor::addConstraint(ExecutionState &state, ref<Expr> condition) {
1614
1618
siie = it->second .end ();
1615
1619
siit != siie; ++siit) {
1616
1620
bool res;
1617
- solver->setTimeout (coreSolverTimeout);
1621
+ solver->setLimits (coreSolverTimeout, coreSolverMemoryLimit );
1618
1622
bool success = solver->mustBeFalse (state.constraints .cs (),
1619
1623
siit->assignment .evaluate (condition),
1620
1624
res, state.queryMetaData );
1621
- solver->setTimeout (time ::Span ());
1625
+ solver->setLimits (time ::Span (), 0 );
1622
1626
assert (success && " FIXME: Unhandled solver failure" );
1623
1627
(void )success;
1624
1628
if (res) {
@@ -1687,9 +1691,9 @@ void Executor::bindArgument(KFunction *kf, unsigned index,
1687
1691
1688
1692
ref<Expr> Executor::toUnique (const ExecutionState &state, ref<Expr> e) {
1689
1693
ref<Expr> result = e;
1690
- solver->setTimeout (coreSolverTimeout);
1694
+ solver->setLimits (coreSolverTimeout, coreSolverMemoryLimit );
1691
1695
solver->tryGetUnique (state.constraints .cs (), e, result, state.queryMetaData );
1692
- solver->setTimeout (time ::Span ());
1696
+ solver->setLimits (time ::Span (), 0 );
1693
1697
return result;
1694
1698
}
1695
1699
@@ -5493,11 +5497,11 @@ void Executor::executeAlloc(ExecutionState &state, ref<Expr> size, bool isLocal,
5493
5497
/* If size greater then upper bound for size, then we will follow
5494
5498
the malloc semantic and return NULL. Otherwise continue execution. */
5495
5499
PartialValidity inBounds;
5496
- solver->setTimeout (coreSolverTimeout);
5500
+ solver->setLimits (coreSolverTimeout, coreSolverMemoryLimit );
5497
5501
bool success =
5498
5502
solver->evaluate (state.constraints .cs (), upperBoundSizeConstraint,
5499
5503
inBounds, state.queryMetaData );
5500
- solver->setTimeout (time ::Span ());
5504
+ solver->setLimits (time ::Span (), 0 );
5501
5505
if (!success) {
5502
5506
terminateStateOnSolverError (state, " Query timed out (resolve)" );
5503
5507
return ;
@@ -5798,21 +5802,21 @@ bool Executor::computeSizes(
5798
5802
objects = constraints.gatherSymcretizedArrays ();
5799
5803
findObjects (symbolicSizesSum, objects);
5800
5804
5801
- solver->setTimeout (coreSolverTimeout);
5805
+ solver->setLimits (coreSolverTimeout, coreSolverMemoryLimit );
5802
5806
bool success = solver->getResponse (
5803
5807
constraints,
5804
5808
UgtExpr::create (symbolicSizesSum,
5805
5809
ConstantExpr::create (SymbolicAllocationThreshold,
5806
5810
symbolicSizesSum->getWidth ())),
5807
5811
response, metaData);
5808
- solver->setTimeout (time ::Span ());
5812
+ solver->setLimits (time ::Span (), 0 );
5809
5813
5810
5814
if (!response->tryGetInitialValuesFor (objects, values)) {
5811
5815
/* Receive model with a smallest sum as possible. */
5812
- solver->setTimeout (coreSolverTimeout);
5816
+ solver->setLimits (coreSolverTimeout, coreSolverMemoryLimit );
5813
5817
success = solver->getMinimalUnsignedValue (constraints, symbolicSizesSum,
5814
5818
minimalSumValue, metaData);
5815
- solver->setTimeout (time ::Span ());
5819
+ solver->setLimits (time ::Span (), 0 );
5816
5820
assert (success);
5817
5821
5818
5822
/* We can simply query the solver to get value of size, but
@@ -5822,9 +5826,9 @@ bool Executor::computeSizes(
5822
5826
ConstraintSet minimized = constraints;
5823
5827
minimized.addConstraint (EqExpr::create (symbolicSizesSum, minimalSumValue));
5824
5828
5825
- solver->setTimeout (coreSolverTimeout);
5829
+ solver->setLimits (coreSolverTimeout, coreSolverMemoryLimit );
5826
5830
success = solver->getInitialValues (minimized, objects, values, metaData);
5827
- solver->setTimeout (time ::Span ());
5831
+ solver->setLimits (time ::Span (), 0 );
5828
5832
}
5829
5833
return success;
5830
5834
}
@@ -6005,10 +6009,10 @@ bool Executor::resolveMemoryObjects(
6005
6009
if (!onlyLazyInitialize || !mayLazyInitialize) {
6006
6010
ResolutionList rl;
6007
6011
6008
- solver->setTimeout (coreSolverTimeout);
6012
+ solver->setLimits (coreSolverTimeout, coreSolverMemoryLimit );
6009
6013
incomplete = state.addressSpace .resolve (state, solver.get (), basePointer,
6010
6014
rl, 0 , coreSolverTimeout);
6011
- solver->setTimeout (time ::Span ());
6015
+ solver->setLimits (time ::Span (), 0 );
6012
6016
6013
6017
for (ResolutionList::iterator i = rl.begin (), ie = rl.end (); i != ie;
6014
6018
++i) {
@@ -6023,10 +6027,10 @@ bool Executor::resolveMemoryObjects(
6023
6027
}
6024
6028
6025
6029
if (mayLazyInitialize) {
6026
- solver->setTimeout (coreSolverTimeout);
6030
+ solver->setLimits (coreSolverTimeout, coreSolverMemoryLimit );
6027
6031
bool success = solver->mayBeTrue (state.constraints .cs (), checkOutOfBounds,
6028
6032
mayLazyInitialize, state.queryMetaData );
6029
- solver->setTimeout (time ::Span ());
6033
+ solver->setLimits (time ::Span (), 0 );
6030
6034
if (!success) {
6031
6035
return false ;
6032
6036
} else if (mayLazyInitialize) {
@@ -6091,10 +6095,10 @@ bool Executor::checkResolvedMemoryObjects(
6091
6095
.simplified ;
6092
6096
6093
6097
PartialValidity result;
6094
- solver->setTimeout (coreSolverTimeout);
6098
+ solver->setLimits (coreSolverTimeout, coreSolverMemoryLimit );
6095
6099
bool success = solver->evaluate (state.constraints .cs (), inBounds, result,
6096
6100
state.queryMetaData );
6097
- solver->setTimeout (time ::Span ());
6101
+ solver->setLimits (time ::Span (), 0 );
6098
6102
if (!success) {
6099
6103
return false ;
6100
6104
}
@@ -6155,10 +6159,10 @@ bool Executor::checkResolvedMemoryObjects(
6155
6159
.simplified ;
6156
6160
6157
6161
bool mayBeInBounds;
6158
- solver->setTimeout (coreSolverTimeout);
6162
+ solver->setLimits (coreSolverTimeout, coreSolverMemoryLimit );
6159
6163
bool success = solver->mayBeTrue (state.constraints .cs (), inBounds,
6160
6164
mayBeInBounds, state.queryMetaData );
6161
- solver->setTimeout (time ::Span ());
6165
+ solver->setLimits (time ::Span (), 0 );
6162
6166
if (!success) {
6163
6167
return false ;
6164
6168
}
@@ -6180,10 +6184,10 @@ bool Executor::checkResolvedMemoryObjects(
6180
6184
}
6181
6185
6182
6186
if (mayBeOutOfBound) {
6183
- solver->setTimeout (coreSolverTimeout);
6187
+ solver->setLimits (coreSolverTimeout, coreSolverMemoryLimit );
6184
6188
bool success = solver->mayBeTrue (state.constraints .cs (), checkOutOfBounds,
6185
6189
mayBeOutOfBound, state.queryMetaData );
6186
- solver->setTimeout (time ::Span ());
6190
+ solver->setLimits (time ::Span (), 0 );
6187
6191
if (!success) {
6188
6192
return false ;
6189
6193
}
@@ -6210,10 +6214,10 @@ bool Executor::makeGuard(ExecutionState &state,
6210
6214
}
6211
6215
}
6212
6216
6213
- solver->setTimeout (coreSolverTimeout);
6217
+ solver->setLimits (coreSolverTimeout, coreSolverMemoryLimit );
6214
6218
bool success = solver->mayBeTrue (state.constraints .cs (), guard, mayBeInBounds,
6215
6219
state.queryMetaData );
6216
- solver->setTimeout (time ::Span ());
6220
+ solver->setLimits (time ::Span (), 0 );
6217
6221
if (!success) {
6218
6222
return false ;
6219
6223
}
@@ -6318,7 +6322,7 @@ void Executor::executeMemoryOperation(
6318
6322
idFastResult = *state->resolvedPointers [base].begin ();
6319
6323
} else {
6320
6324
ObjectPair idFastOp;
6321
- solver->setTimeout (coreSolverTimeout);
6325
+ solver->setLimits (coreSolverTimeout, coreSolverMemoryLimit );
6322
6326
6323
6327
if (!state->addressSpace .resolveOne (*state, solver.get (), address, idFastOp,
6324
6328
success, haltExecution)) {
@@ -6327,7 +6331,7 @@ void Executor::executeMemoryOperation(
6327
6331
cast<ConstantPointerExpr>(address), idFastOp);
6328
6332
}
6329
6333
6330
- solver->setTimeout (time ::Span ());
6334
+ solver->setLimits (time ::Span (), 0 );
6331
6335
6332
6336
if (success) {
6333
6337
idFastResult = idFastOp.first ;
@@ -6352,16 +6356,16 @@ void Executor::executeMemoryOperation(
6352
6356
.simplified ;
6353
6357
6354
6358
ref<SolverResponse> response;
6355
- solver->setTimeout (coreSolverTimeout);
6359
+ solver->setLimits (coreSolverTimeout, coreSolverMemoryLimit );
6356
6360
bool success = solver->getResponse (state->constraints .cs (), inBounds,
6357
6361
response, state->queryMetaData );
6358
- solver->setTimeout (time ::Span ());
6362
+ solver->setLimits (time ::Span (), 0 );
6359
6363
if (!success) {
6360
6364
state->pc = state->prevPC ;
6361
6365
terminateStateOnSolverError (*state, " Query timed out (bounds check)." );
6362
6366
return ;
6363
6367
}
6364
- solver->setTimeout (time ::Span ());
6368
+ solver->setLimits (time ::Span (), 0 );
6365
6369
6366
6370
bool mustBeInBounds = !isa<InvalidResponse>(response);
6367
6371
if (mustBeInBounds) {
@@ -6414,10 +6418,10 @@ void Executor::executeMemoryOperation(
6414
6418
allLeafsAreConstant (address)) {
6415
6419
ObjectPair idFastOp;
6416
6420
6417
- solver->setTimeout (coreSolverTimeout);
6421
+ solver->setLimits (coreSolverTimeout, coreSolverMemoryLimit );
6418
6422
state->addressSpace .resolveOne (*state, solver.get (), basePointer, idFastOp,
6419
6423
success, haltExecution);
6420
- solver->setTimeout (time ::Span ());
6424
+ solver->setLimits (time ::Span (), 0 );
6421
6425
6422
6426
if (!success) {
6423
6427
terminateStateOnTargetError (*state, ReachWithError::UseAfterFree);
@@ -6684,11 +6688,11 @@ ref<const MemoryObject> Executor::lazyInitializeObject(
6684
6688
sizeExpr, Expr::createPointer (MaxSymbolicAllocationSize));
6685
6689
}
6686
6690
bool mayBeInBounds;
6687
- solver->setTimeout (coreSolverTimeout);
6691
+ solver->setLimits (coreSolverTimeout, coreSolverMemoryLimit );
6688
6692
bool success = solver->mayBeTrue (state.constraints .cs (),
6689
6693
AndExpr::create (lowerBound, upperBound),
6690
6694
mayBeInBounds, state.queryMetaData );
6691
- solver->setTimeout (time ::Span ());
6695
+ solver->setLimits (time ::Span (), 0 );
6692
6696
if (!success) {
6693
6697
return nullptr ;
6694
6698
}
@@ -7430,7 +7434,7 @@ bool isMakeSymbolicSymbol(const klee::Symbolic &symb) {
7430
7434
}
7431
7435
7432
7436
bool Executor::getSymbolicSolution (const ExecutionState &state, KTest &res) {
7433
- solver->setTimeout (coreSolverTimeout);
7437
+ solver->setLimits (coreSolverTimeout, coreSolverMemoryLimit );
7434
7438
7435
7439
PathConstraints extendedConstraints (state.constraints );
7436
7440
@@ -7504,11 +7508,11 @@ bool Executor::getSymbolicSolution(const ExecutionState &state, KTest &res) {
7504
7508
std::vector<const Array *> objects (objectSet.begin (), objectSet.end ());
7505
7509
7506
7510
ref<SolverResponse> response;
7507
- solver->setTimeout (coreSolverTimeout);
7511
+ solver->setLimits (coreSolverTimeout, coreSolverMemoryLimit );
7508
7512
bool success =
7509
7513
solver->getResponse (extendedConstraints.cs (), Expr::createFalse (),
7510
7514
response, state.queryMetaData );
7511
- solver->setTimeout (time ::Span ());
7515
+ solver->setLimits (time ::Span (), 0 );
7512
7516
if (!success || !isa<InvalidResponse>(response)) {
7513
7517
klee_warning (" unable to compute initial values (invalid constraints?)!" );
7514
7518
ExprPPrinter::printQuery (llvm::errs (), state.constraints .cs (),
@@ -7588,14 +7592,14 @@ bool Executor::getSymbolicSolution(const ExecutionState &state, KTest &res) {
7588
7592
7589
7593
ref<Expr> concretizationCondition = Expr::createFalse ();
7590
7594
for (const auto &concretization : concretizations) {
7591
- solver->setTimeout (coreSolverTimeout);
7595
+ solver->setLimits (coreSolverTimeout, coreSolverMemoryLimit );
7592
7596
success = solver->getResponse (
7593
7597
extendedConstraints.cs (),
7594
7598
OrExpr::create (Expr::createIsZero (EqExpr::create (
7595
7599
concretization.first , concretization.second )),
7596
7600
concretizationCondition),
7597
7601
response, state.queryMetaData );
7598
- solver->setTimeout (time ::Span ());
7602
+ solver->setLimits (time ::Span (), 0 );
7599
7603
7600
7604
if (auto invalidResponse = dyn_cast<InvalidResponse>(response)) {
7601
7605
concretizationCondition =
0 commit comments