@@ -7368,8 +7368,8 @@ void Executor::setInitializationGraph(
7368
7368
return ;
7369
7369
}
7370
7370
7371
- bool isReproducible (const klee::Symbolic &symb ) {
7372
- auto arr = symb. array ;
7371
+ bool isReproducible (const klee::Array *array ) {
7372
+ auto arr = array;
7373
7373
bool bad = IrreproducibleSource::classof (arr->source .get ());
7374
7374
if (auto liSource = dyn_cast<LazyInitializationSource>(arr->source .get ())) {
7375
7375
std::vector<const Array *> arrays;
@@ -7385,6 +7385,10 @@ bool isReproducible(const klee::Symbolic &symb) {
7385
7385
return !bad;
7386
7386
}
7387
7387
7388
+ bool isIrreproducible (const klee::Array *array) {
7389
+ return !isReproducible (array);
7390
+ }
7391
+
7388
7392
bool isUninitialized (const klee::Array *array) {
7389
7393
bool bad = isa<UninitializedSource>(array->source );
7390
7394
if (bad)
@@ -7394,7 +7398,11 @@ bool isUninitialized(const klee::Array *array) {
7394
7398
return bad;
7395
7399
}
7396
7400
7397
- bool isMakeSymbolic (const klee::Symbolic &symb) {
7401
+ bool isReproducibleSymbol (const klee::Symbolic &symb) {
7402
+ return isReproducible (symb.array );
7403
+ }
7404
+
7405
+ bool isMakeSymbolicSymbol (const klee::Symbolic &symb) {
7398
7406
auto array = symb.array ;
7399
7407
bool good = isa<MakeSymbolicSource>(array->source );
7400
7408
if (!good)
@@ -7445,20 +7453,23 @@ bool Executor::getSymbolicSolution(const ExecutionState &state, KTest &res) {
7445
7453
std::vector<const Array *> uninitObjects;
7446
7454
std::copy_if (allObjects.begin (), allObjects.end (),
7447
7455
std::back_inserter (uninitObjects), isUninitialized);
7456
+ std::vector<const Array *> irreproducibleObjects;
7457
+ std::copy_if (allObjects.begin (), allObjects.end (),
7458
+ std::back_inserter (irreproducibleObjects), isIrreproducible);
7448
7459
7449
7460
std::vector<klee::Symbolic> symbolics;
7450
7461
7451
7462
if (OnlyOutputMakeSymbolicArrays) {
7452
7463
std::copy_if (state.symbolics .begin (), state.symbolics .end (),
7453
- std::back_inserter (symbolics), isMakeSymbolic );
7464
+ std::back_inserter (symbolics), isMakeSymbolicSymbol );
7454
7465
} else {
7455
7466
std::copy_if (state.symbolics .begin (), state.symbolics .end (),
7456
- std::back_inserter (symbolics), isReproducible );
7467
+ std::back_inserter (symbolics), isReproducibleSymbol );
7457
7468
}
7458
7469
7459
7470
// we cannot be sure that an irreproducible state proves the presence of an
7460
7471
// error
7461
- if (uninitObjects.size () > 0 || state. symbolics . size () != symbolics. size () ) {
7472
+ if (uninitObjects.size () > 0 || irreproducibleObjects. size () > 0 ) {
7462
7473
state.error = ReachWithError::None;
7463
7474
} else if (FunctionCallReproduce != " " &&
7464
7475
state.error == ReachWithError::Reachable) {
0 commit comments