Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
015cbc3
Upgrade kotlin version
CaelmBleidd Dec 20, 2024
1248a67
Type coercion
CaelmBleidd Dec 20, 2024
beccd93
Some fixes
CaelmBleidd Jan 14, 2025
ff880f7
Tmp commit
CaelmBleidd Jan 16, 2025
8bbfedc
Tmp commit
CaelmBleidd Jan 16, 2025
2484658
Govno
CaelmBleidd Jan 16, 2025
c065b19
MultiExpr support
CaelmBleidd Jan 17, 2025
21c686b
EQ operator support
CaelmBleidd Jan 17, 2025
567c7f6
tmp commit
CaelmBleidd Jan 17, 2025
d227391
Remove multiexpr and multivalue
CaelmBleidd Jan 17, 2025
0fb485f
Add caches for local sorts
CaelmBleidd Jan 20, 2025
80bfa8a
Support arguments resolve
CaelmBleidd Jan 20, 2025
b45b6aa
Drochilnya with unresolved objects
CaelmBleidd Jan 22, 2025
3248239
Draft fields support
Lipen Jan 23, 2025
4e47ab5
Make tests on fields working
Lipen Jan 23, 2025
f672517
Continuation of drochilnya with unresolved objects
CaelmBleidd Jan 23, 2025
28c9fa8
Completed test
CaelmBleidd Jan 23, 2025
c323bb5
Eval expr in model
Lipen Jan 23, 2025
b80db92
Format
Lipen Jan 23, 2025
ee705a5
Format
Lipen Jan 23, 2025
057b865
Support any
Lipen Jan 23, 2025
86f124d
Fix indent
Lipen Jan 23, 2025
00cb506
Cleanup
Lipen Jan 23, 2025
9a1c43b
Use fp64Sort
Lipen Jan 23, 2025
8d288c1
Cleanup
Lipen Jan 23, 2025
8001d7d
fix ICE
Lipen Jan 23, 2025
fd7bda1
Remove old comments
Lipen Jan 23, 2025
8695f20
Fix check
Lipen Jan 23, 2025
945323e
Add comment about ToBoolean
Lipen Jan 23, 2025
0d4ad61
Cleanup
Lipen Jan 23, 2025
545c334
Add EXACTLY_ONCE invokation contract for calcOnState and doWithState
Lipen Jan 23, 2025
9047742
More tests for And
Lipen Jan 23, 2025
f85c92f
More tests
Lipen Jan 23, 2025
3de12b0
Add class for expr with type guard
CaelmBleidd Jan 24, 2025
9f61e97
Add type constraint in fake type creation
CaelmBleidd Jan 24, 2025
39a4ee5
Add example with nan equality
CaelmBleidd Jan 24, 2025
a4cabdb
Remove redundant code with expr transformer
CaelmBleidd Jan 24, 2025
6e214c4
Add a clarification comment
CaelmBleidd Jan 24, 2025
db90185
Remove multiple asserts during one scope call
CaelmBleidd Jan 24, 2025
4cabbfa
Disable test
CaelmBleidd Jan 24, 2025
0e406b7
Disable tests
CaelmBleidd Jan 24, 2025
8b7f9b1
Bump jacodb version
CaelmBleidd Jan 24, 2025
cc43637
Rebase fixes
CaelmBleidd Jan 24, 2025
aa18660
Remove non-related changes
CaelmBleidd Jan 24, 2025
56a8aef
TSTest modification
CaelmBleidd Jan 24, 2025
5306128
Throw error if a value cannot be extracted
CaelmBleidd Jan 24, 2025
4a26215
Prepare for review
CaelmBleidd Jan 24, 2025
c46970e
Notice
CaelmBleidd Jan 24, 2025
0ed314d
Move truthy utils
Lipen Jan 24, 2025
cb7112a
Manual CFG construction
Lipen Jan 24, 2025
e128e8a
Add contract for isFakeObject
Lipen Jan 27, 2025
7483148
Wrap non-bool-sort-expr inside IfStmt in mkTruthy
Lipen Jan 27, 2025
d08d178
Fix manual cfg in test
Lipen Jan 27, 2025
68e79d0
Rename boolToFp
Lipen Jan 27, 2025
ec653a5
Format
Lipen Jan 27, 2025
6a6d6a1
Improve tests for And with numbers
Lipen Jan 27, 2025
5f9515f
Improve numberAndNumber test
Lipen Jan 27, 2025
7e1d259
Format
Lipen Jan 27, 2025
f05c609
Extract truthyExpr constructor into util class
CaelmBleidd Jan 28, 2025
0758c05
Uncomment TSUnaryOperator.Not instruction
CaelmBleidd Jan 28, 2025
3d42af2
Extract a field lookup
CaelmBleidd Jan 28, 2025
c2edcc3
Added a comment about arguments sorts in calls
CaelmBleidd Jan 28, 2025
654ac33
Fix mistake with control flow in resolveFakeObject operator
CaelmBleidd Jan 28, 2025
47d72a9
Extract operation with scope from TSContext
CaelmBleidd Jan 28, 2025
e3bb791
Replace mutable maps with UPersistentHashMaps
CaelmBleidd Jan 29, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions usvm-ts/src/main/kotlin/org/usvm/machine/TSContext.kt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ import org.usvm.machine.interpreter.TSStepScope
import org.usvm.machine.types.ExprWithTypeConstraint
import org.usvm.machine.types.FakeType
import org.usvm.types.single
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract

typealias TSSizeSort = UBv32Sort

Expand All @@ -51,8 +53,6 @@ class TSContext(
// TODO fix conjuncts
fun mkTruthyExpr(expr: UExpr<out USort>, scope: TSStepScope): UBoolExpr = scope.calcOnState {
if (expr.isFakeObject()) {
expr as UConcreteHeapRef

val falseBranchGround = makeSymbolicPrimitive(boolSort)

val conjuncts = mutableListOf<ExprWithTypeConstraint<UBoolSort>>()
Expand Down Expand Up @@ -117,10 +117,13 @@ class TSContext(
}
}

@OptIn(ExperimentalContracts::class)
fun UExpr<out USort>.isFakeObject(): Boolean {
if (sort !is UAddressSort) return false
contract {
returns(true) implies (this@isFakeObject is UConcreteHeapRef)
}

return this is UConcreteHeapRef && address > MAGIC_OFFSET
return sort == addressSort && this is UConcreteHeapRef && address > MAGIC_OFFSET
}

fun mkFakeValue(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,10 @@ import org.usvm.UExpr
import org.usvm.USort
import org.usvm.api.makeSymbolicPrimitive
import org.usvm.collection.field.UFieldLValue
import org.usvm.machine.types.FakeType
import org.usvm.machine.TSContext
import org.usvm.machine.interpreter.TSStepScope
import org.usvm.machine.operator.TSBinaryOperator
import org.usvm.machine.types.FakeType
import org.usvm.memory.ULValue
import org.usvm.memory.URegisterStackLValue

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,16 @@ class TSInterpreter(
private fun visitIfStmt(scope: TSStepScope, stmt: EtsIfStmt) {
val exprResolver = exprResolverWithScope(scope)

val boolExpr = exprResolver.resolve(stmt.condition)?.asExpr(ctx.boolSort)
?: run {
logger.warn { "Failed to resolve condition: $stmt" }
return
}
val conditionExpr = exprResolver.resolve(stmt.condition) ?: run {
logger.warn { "Failed to resolve condition: $stmt" }
return
}

val boolExpr = if (conditionExpr.sort == ctx.boolSort) {
conditionExpr.asExpr(ctx.boolSort)
} else {
ctx.mkTruthyExpr(conditionExpr, scope)
}

val (negStmt, posStmt) = applicationGraph.successors(stmt).take(2).toList()

Expand All @@ -102,7 +107,7 @@ class TSInterpreter(
posStmt,
negStmt,
blockOnTrueState = { newStmt(posStmt) },
blockOnFalseState = { newStmt(negStmt) }
blockOnFalseState = { newStmt(negStmt) },
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,20 @@ import io.ksmt.sort.KFp64Sort
import io.ksmt.utils.asExpr
import io.ksmt.utils.cast

Check warning

Code scanning / detekt

Detects imports in non default order

Imports must be ordered in lexicographic order without any empty lines in-between with "java", "javax", "kotlin" and aliases in the end
import org.usvm.UAddressSort
import org.usvm.UBoolExpr
import org.usvm.UBoolSort
import org.usvm.UConcreteHeapRef
import org.usvm.UExpr
import org.usvm.USort
import org.usvm.api.makeSymbolicPrimitive
import org.usvm.api.typeStreamOf
import org.usvm.machine.types.FakeType
import org.usvm.machine.TSContext
import org.usvm.machine.expr.TSUndefinedSort
import org.usvm.machine.expr.tctx
import org.usvm.machine.interpreter.TSStepScope
import org.usvm.machine.types.ExprWithTypeConstraint
import org.usvm.machine.types.FakeType
import org.usvm.machine.types.iteWriteIntoFakeObject
import org.usvm.types.single
import org.usvm.util.boolToFpSort
import org.usvm.util.boolToFp

sealed interface TSBinaryOperator {

Expand Down Expand Up @@ -113,9 +111,6 @@ sealed interface TSBinaryOperator {
val groundFalseBranch = makeSymbolicPrimitive(boolSort)

if (lhs.isFakeObject() && rhs.isFakeObject()) {
lhs as UConcreteHeapRef
rhs as UConcreteHeapRef

val lhsType = memory.typeStreamOf(lhs).single() as FakeType
val rhsType = memory.typeStreamOf(rhs).single() as FakeType

Expand Down Expand Up @@ -153,7 +148,7 @@ sealed interface TSBinaryOperator {
conjuncts += ExprWithTypeConstraint(
constraint = mkAnd(lhsType.boolTypeExpr, rhsType.fpTypeExpr),
expr = mkFpEqualExpr(
boolToFpSort(memory.read(getIntermediateBoolLValue(lhs.address))),
boolToFp(memory.read(getIntermediateBoolLValue(lhs.address))),
memory.read(getIntermediateFpLValue(rhs.address))
)
)
Expand All @@ -162,15 +157,14 @@ sealed interface TSBinaryOperator {
constraint = mkAnd(lhsType.fpTypeExpr, rhsType.boolTypeExpr),
expr = mkFpEqualExpr(
memory.read(getIntermediateFpLValue(lhs.address)),
boolToFpSort(memory.read(getIntermediateBoolLValue(rhs.address)))
boolToFp(memory.read(getIntermediateBoolLValue(rhs.address)))
)
)

// TODO: support objects
}

if (lhs.isFakeObject()) {
lhs as UConcreteHeapRef
val lhsType = memory.typeStreamOf(lhs).single() as FakeType

scope.assert(lhsType.mkExactlyOneTypeConstraint(ctx))
Expand All @@ -189,7 +183,7 @@ sealed interface TSBinaryOperator {
constraint = lhsType.fpTypeExpr,
expr = mkFpEqualExpr(
memory.read(getIntermediateFpLValue(lhs.address)),
boolToFpSort(rhs.asExpr(boolSort))
boolToFp(rhs.asExpr(boolSort))
)
)

Expand All @@ -200,7 +194,7 @@ sealed interface TSBinaryOperator {
conjuncts += ExprWithTypeConstraint(
constraint = lhsType.boolTypeExpr,
expr = mkFpEqualExpr(
boolToFpSort(memory.read(getIntermediateBoolLValue(lhs.address))),
boolToFp(memory.read(getIntermediateBoolLValue(lhs.address))),
rhs.asExpr(fp64Sort)
)
)
Expand Down Expand Up @@ -235,7 +229,6 @@ sealed interface TSBinaryOperator {
}

if (rhs.isFakeObject()) {
rhs as UConcreteHeapRef
val rhsType = memory.typeStreamOf(rhs).single() as FakeType

scope.assert(rhsType.mkExactlyOneTypeConstraint(ctx))
Expand All @@ -253,7 +246,7 @@ sealed interface TSBinaryOperator {
conjuncts += ExprWithTypeConstraint(
constraint = rhsType.fpTypeExpr,
expr = mkFpEqualExpr(
boolToFpSort(lhs.asExpr(boolSort)),
boolToFp(lhs.asExpr(boolSort)),
memory.read(getIntermediateFpLValue(rhs.address))
)
)
Expand All @@ -266,7 +259,7 @@ sealed interface TSBinaryOperator {
constraint = rhsType.boolTypeExpr,
expr = mkFpEqualExpr(
lhs.asExpr(fp64Sort),
boolToFpSort(memory.read(getIntermediateBoolLValue(rhs.address)))
boolToFp(memory.read(getIntermediateBoolLValue(rhs.address)))
)
)

Expand Down Expand Up @@ -325,11 +318,11 @@ sealed interface TSBinaryOperator {
}

if (lhs.sort is UBoolSort && rhs.sort is KFp64Sort) {
return mkFpEqualExpr(boolToFpSort(lhs.cast()), rhs.cast())
return mkFpEqualExpr(boolToFp(lhs.cast()), rhs.cast())
}

if (lhs.sort is KFp64Sort && rhs.sort is UBoolSort) {
return mkFpEqualExpr(lhs.cast(), boolToFpSort(rhs.cast()))
return mkFpEqualExpr(lhs.cast(), boolToFp(rhs.cast()))
}

// TODO: support string
Expand Down Expand Up @@ -399,8 +392,8 @@ sealed interface TSBinaryOperator {
): UExpr<out USort> {
return mkFpAddExpr(
fpRoundingModeSortDefaultValue(),
boolToFpSort(lhs),
boolToFpSort(rhs)
boolToFp(lhs),
boolToFp(rhs)
)

}
Expand Down Expand Up @@ -444,11 +437,11 @@ sealed interface TSBinaryOperator {

val fpValue = when {
lhs.sort is UBoolSort && rhs.sort is KFp64Sort -> {
mkFpAddExpr(fpRoundingModeSortDefaultValue(), boolToFpSort(lhs.cast()), rhs.cast())
mkFpAddExpr(fpRoundingModeSortDefaultValue(), boolToFp(lhs.cast()), rhs.cast())
}

lhs.sort is KFp64Sort && rhs.sort is UBoolSort -> {
mkFpAddExpr(fpRoundingModeSortDefaultValue(), lhs.cast(), boolToFpSort(rhs.cast()))
mkFpAddExpr(fpRoundingModeSortDefaultValue(), lhs.cast(), boolToFp(rhs.cast()))
}

else -> null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ fun <T : USort> TSState.extractValue(
): Pair<UExpr<T>?, UBoolExpr> = with(ctx) {
when {
value.isFakeObject() -> {
value as UConcreteHeapRef
val lValue = extractIntermediateLValue(value.address)

val type = memory.typeStreamOf(value).single() as FakeType
Expand Down
2 changes: 1 addition & 1 deletion usvm-ts/src/main/kotlin/org/usvm/util/Utils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@ import org.usvm.UExpr
import org.usvm.machine.TSContext

// Built-in KContext.bvToBool has identical implementation.
fun TSContext.boolToFpSort(expr: UExpr<UBoolSort>): UExpr<KFp64Sort> =
fun TSContext.boolToFp(expr: UExpr<UBoolSort>): UExpr<KFp64Sort> =
mkIte(expr, mkFp64(1.0), mkFp64(0.0))
Loading