@@ -5391,6 +5391,7 @@ void Executor::run(ExecutionState *initialState,
53915391 } else if (ExecutionMode == ExecutionKind::Bidirectional) {
53925392 InitializerPredicate *predicate = new TraceVerifyPredicate (
53935393 data.specialPoints , *codeGraphInfo.get (), InitializeInJoinBlocks);
5394+ // object manager assumes ownership over predicate
53945395 objectManager->setPredicate (predicate);
53955396 auto initializer = createIsolatedStatesInitializer (predicate, data);
53965397 isolatedStatesInitializer = initializer.get ();
@@ -7380,8 +7381,10 @@ void Executor::lazyInitializeLocalObject(ExecutionState &state, StackFrame &sf,
73807381 ref<const MemoryObject> id = lazyInitializeObject (
73817382 state, pointer, target, elementSize, size, true , conditionExpr,
73827383 state.isolated || UseSymbolicSizeLazyInit);
7383- state.addPointerResolution (pointer, id.get ());
7384- state.addPointerResolution (basePointer, id.get ());
7384+ if (!state.isolated ) {
7385+ state.addPointerResolution (pointer, id.get ());
7386+ state.addPointerResolution (basePointer, id.get ());
7387+ }
73857388 state.addConstraint (EqExpr::create (address, id->getBaseExpr ()));
73867389 state.addConstraint (
73877390 Expr::createIsZero (EqExpr::create (address, Expr::createPointer (0 ))));
@@ -7390,6 +7393,14 @@ void Executor::lazyInitializeLocalObject(ExecutionState &state, StackFrame &sf,
73907393 }
73917394 RefObjectPair op = state.addressSpace .findOrLazyInitializeObject (id.get ());
73927395 state.addressSpace .bindObject (op.first , op.second .get ());
7396+ if (state.localObjects .count (id) == 0 ) {
7397+ for (auto localObject : state.localObjects ) {
7398+ auto localObjectAddress = localObject->getBaseExpr ();
7399+ state.constraints .addConstraint (Expr::createIsZero (
7400+ EqExpr::create (id->getBaseExpr (), localObjectAddress)));
7401+ }
7402+ state.localObjects .insert (id);
7403+ }
73937404}
73947405
73957406void Executor::lazyInitializeLocalObject (ExecutionState &state,
0 commit comments