Skip to content

Commit df8dcd5

Browse files
committed
[fix] fixed assumeSymbolic
1 parent 93ad851 commit df8dcd5

2 files changed

Lines changed: 11 additions & 20 deletions

File tree

usvm-core/src/main/kotlin/org/usvm/Expressions.kt

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import io.ksmt.sort.KSort
2323
import io.ksmt.sort.KUninterpretedSort
2424
import org.usvm.memory.USymbolicCollection
2525
import org.usvm.memory.USymbolicCollectionId
26-
import org.usvm.memory.foldHeapRefWithStaticAsConcrete
2726
import kotlin.contracts.ExperimentalContracts
2827
import kotlin.contracts.contract
2928

@@ -101,18 +100,6 @@ fun isStaticHeapRef(expr: UExpr<*>): Boolean {
101100
val UConcreteHeapRef.isAllocated: Boolean get() = address.isAllocated
102101
val UConcreteHeapRef.isStatic: Boolean get() = address.isStatic
103102

104-
val UHeapRef.isConcrete: Boolean get() {
105-
return foldHeapRefWithStaticAsConcrete(
106-
ref = this,
107-
initial = true,
108-
initialGuard = this.ctx.trueExpr,
109-
ignoreNullRefs = true,
110-
collapseHeapRefs = true,
111-
blockOnConcrete = { acc, _ -> acc },
112-
blockOnSymbolic = { _, _ -> return false }
113-
)
114-
}
115-
116103
class UConcreteHeapRefDecl internal constructor(
117104
ctx: UContext<*>,
118105
val address: UConcreteHeapAddress,

usvm-jvm/src/main/kotlin/org/usvm/machine/JcApproximations.kt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ import org.usvm.collection.array.UArrayIndexLValue
8585
import org.usvm.collection.array.length.UArrayLengthLValue
8686
import org.usvm.collection.field.UFieldLValue
8787
import org.usvm.getIntValue
88-
import org.usvm.isConcrete
8988
import org.usvm.jvm.util.allInstanceFields
9089
import org.usvm.jvm.util.javaName
9190
import org.usvm.machine.interpreter.JcExprResolver
@@ -95,6 +94,7 @@ import org.usvm.machine.state.JcState
9594
import org.usvm.machine.state.newStmt
9695
import org.usvm.machine.state.skipMethodInvocationAndBoxIfNeeded
9796
import org.usvm.machine.state.skipMethodInvocationWithValue
97+
import org.usvm.memory.foldHeapRefWithStaticAsConcrete
9898
import org.usvm.mkSizeExpr
9999
import org.usvm.sizeSort
100100
import 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

Comments
 (0)