@@ -7384,8 +7384,8 @@ void Executor::setInitializationGraph(
7384
7384
return ;
7385
7385
}
7386
7386
7387
- bool isReproducible (const klee::Symbolic &symb ) {
7388
- auto arr = symb. array ;
7387
+ bool isReproducible (const klee::Array *array ) {
7388
+ auto arr = array;
7389
7389
bool bad = IrreproducibleSource::classof (arr->source .get ());
7390
7390
if (auto liSource = dyn_cast<LazyInitializationSource>(arr->source .get ())) {
7391
7391
std::vector<const Array *> arrays;
@@ -7401,6 +7401,10 @@ bool isReproducible(const klee::Symbolic &symb) {
7401
7401
return !bad;
7402
7402
}
7403
7403
7404
+ bool isIrreproducible (const klee::Array *array) {
7405
+ return !isReproducible (array);
7406
+ }
7407
+
7404
7408
bool isUninitialized (const klee::Array *array) {
7405
7409
bool bad = isa<UninitializedSource>(array->source );
7406
7410
if (bad)
@@ -7410,7 +7414,11 @@ bool isUninitialized(const klee::Array *array) {
7410
7414
return bad;
7411
7415
}
7412
7416
7413
- bool isMakeSymbolic (const klee::Symbolic &symb) {
7417
+ bool isReproducibleSymbol (const klee::Symbolic &symb) {
7418
+ return isReproducible (symb.array );
7419
+ }
7420
+
7421
+ bool isMakeSymbolicSymbol (const klee::Symbolic &symb) {
7414
7422
auto array = symb.array ;
7415
7423
bool good = isa<MakeSymbolicSource>(array->source );
7416
7424
if (!good)
@@ -7461,20 +7469,23 @@ bool Executor::getSymbolicSolution(const ExecutionState &state, KTest &res) {
7461
7469
std::vector<const Array *> uninitObjects;
7462
7470
std::copy_if (allObjects.begin (), allObjects.end (),
7463
7471
std::back_inserter (uninitObjects), isUninitialized);
7472
+ std::vector<const Array *> irreproducibleObjects;
7473
+ std::copy_if (allObjects.begin (), allObjects.end (),
7474
+ std::back_inserter (irreproducibleObjects), isIrreproducible);
7464
7475
7465
7476
std::vector<klee::Symbolic> symbolics;
7466
7477
7467
7478
if (OnlyOutputMakeSymbolicArrays) {
7468
7479
std::copy_if (state.symbolics .begin (), state.symbolics .end (),
7469
- std::back_inserter (symbolics), isMakeSymbolic );
7480
+ std::back_inserter (symbolics), isMakeSymbolicSymbol );
7470
7481
} else {
7471
7482
std::copy_if (state.symbolics .begin (), state.symbolics .end (),
7472
- std::back_inserter (symbolics), isReproducible );
7483
+ std::back_inserter (symbolics), isReproducibleSymbol );
7473
7484
}
7474
7485
7475
7486
// we cannot be sure that an irreproducible state proves the presence of an
7476
7487
// error
7477
- if (uninitObjects.size () > 0 || state. symbolics . size () != symbolics. size () ) {
7488
+ if (uninitObjects.size () > 0 || irreproducibleObjects. size () > 0 ) {
7478
7489
state.error = ReachWithError::None;
7479
7490
} else if (FunctionCallReproduce != " " &&
7480
7491
state.error == ReachWithError::Reachable) {
0 commit comments