@@ -85,7 +85,6 @@ import org.usvm.collection.array.UArrayIndexLValue
8585import org.usvm.collection.array.length.UArrayLengthLValue
8686import org.usvm.collection.field.UFieldLValue
8787import org.usvm.getIntValue
88- import org.usvm.isConcrete
8988import org.usvm.jvm.util.allInstanceFields
9089import org.usvm.jvm.util.javaName
9190import org.usvm.machine.interpreter.JcExprResolver
@@ -95,6 +94,7 @@ import org.usvm.machine.state.JcState
9594import org.usvm.machine.state.newStmt
9695import org.usvm.machine.state.skipMethodInvocationAndBoxIfNeeded
9796import org.usvm.machine.state.skipMethodInvocationWithValue
97+ import org.usvm.memory.foldHeapRefWithStaticAsConcrete
9898import org.usvm.mkSizeExpr
9999import org.usvm.sizeSort
100100import org.usvm.types.first
@@ -1043,12 +1043,16 @@ class JcMethodApproximationResolver(
10431043 }
10441044 dispatchUsvmApiMethod(Engine ::assumeSymbolic) {
10451045 val instance = it.arguments[0 ].asExpr(ctx.addressSort)
1046- if (instance.isConcrete) {
1047- ctx.voidValue
1048- } else {
1049- val condition = it.arguments[1 ].asExpr(ctx.booleanSort)
1050- scope.assert (condition)?.let { ctx.voidValue }
1051- }
1046+ val condition = it.arguments[1 ].asExpr(ctx.booleanSort)
1047+ foldHeapRefWithStaticAsConcrete<Unit ?>(
1048+ ref = instance,
1049+ initial = Unit ,
1050+ initialGuard = ctx.trueExpr,
1051+ ignoreNullRefs = true ,
1052+ collapseHeapRefs = true ,
1053+ blockOnConcrete = { _, _ -> Unit },
1054+ blockOnSymbolic = { acc, ref -> scope.assert (ctx.mkImplies(ref.guard, condition)) ? : acc }
1055+ )?.let { ctx.voidValue }
10521056 }
10531057 dispatchUsvmApiMethod(Engine ::makeSymbolicBoolean) {
10541058 scope.calcOnState { makeSymbolicPrimitive(ctx.booleanSort) }
0 commit comments