Skip to content

Commit

Permalink
Fix: review comments
Browse files Browse the repository at this point in the history
  • Loading branch information
sergeypospelov committed Jun 28, 2023
1 parent 22522f3 commit 784c221
Show file tree
Hide file tree
Showing 14 changed files with 54 additions and 42 deletions.
2 changes: 2 additions & 0 deletions usvm-core/src/main/kotlin/org/usvm/ApplicationGraph.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,6 @@ interface ApplicationGraph<Method, Statement> {
fun exitPoints(method: Method): Sequence<Statement>

fun methodOf(node: Statement): Method

fun statementsOf(method: Method): Sequence<Statement>
}
2 changes: 1 addition & 1 deletion usvm-core/src/main/kotlin/org/usvm/Machine.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package org.usvm

import org.usvm.ps.stopstregies.StoppingStrategy
import org.usvm.ps.stopstrategies.StoppingStrategy


/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.usvm.ps.stopstregies
package org.usvm.ps.stopstrategies

class CollectedStatesLimitStrategy(
val statesLimit: Int = STATES_LIMIT
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.usvm.ps.stopstregies
package org.usvm.ps.stopstrategies

import org.usvm.ApplicationGraph
import org.usvm.ps.statistics.Statistics
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.usvm.ps.stopstregies
package org.usvm.ps.stopstrategies

fun interface StoppingStrategy {
fun shouldStop(): Boolean
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.usvm.ps.stopstregies
package org.usvm.ps.stopstrategies

import org.usvm.ApplicationGraph
import org.usvm.ps.statistics.Statistics
Expand All @@ -8,31 +8,11 @@ class TargetsCoveredStoppingStrategy<Method, Statement>(
graph: ApplicationGraph<Method, Statement>,
) : Statistics<Method, Statement>(graph), StoppingStrategy {
private val uncoveredStatements = methods
.flatMap { findAllStatementsOfMethod(it) }
.flatMap { graph.statementsOf(it) }
.toMutableSet()

val uncoveredStatementsCount get() = uncoveredStatements.size

private fun findAllStatementsOfMethod(method: Method): Collection<Statement> {
val entryStatements = graph.entryPoint(method)
val statements = entryStatements.toMutableSet()

val queue = ArrayDeque(entryStatements.toList())

while (queue.isNotEmpty()) {
val statement = queue.removeLast()
val successors = graph.successors(statement)
for (successor in successors) {
if (successor !in statements) {
statements += successor
queue += successor
}
}
}

return statements
}

override fun shouldStop(): Boolean = uncoveredStatements.isEmpty()

override fun onStatementVisit(statement: Statement) {
Expand Down
20 changes: 10 additions & 10 deletions usvm-core/src/test/kotlin/org/usvm/model/ModelDecodingTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -156,15 +156,15 @@ class ModelDecodingTest {
val idx = stack.readRegister(3, bv32Sort)

heap.writeArrayIndex(concreteRef, concreteIdx, array, addressSort, symbolicRef1, trueExpr)
val readedRef = heap.readArrayIndex(concreteRef, idx, array, addressSort)
val readRef = heap.readArrayIndex(concreteRef, idx, array, addressSort)

val readedRef1 = heap.readArrayIndex(symbolicRef2, idx, array, addressSort)
val readRef1 = heap.readArrayIndex(symbolicRef2, idx, array, addressSort)

heap.writeArrayIndex(readedRef, idx, array, addressSort, symbolicRef0, trueExpr)
heap.writeArrayIndex(readRef, idx, array, addressSort, symbolicRef0, trueExpr)

val readedRef2 = heap.readArrayIndex(symbolicRef2, idx, array, addressSort)
val readRef2 = heap.readArrayIndex(symbolicRef2, idx, array, addressSort)

pc += (symbolicRef2 neq nullRef) and (readedRef1 neq readedRef2)
pc += (symbolicRef2 neq nullRef) and (readRef1 neq readRef2)

val status = solver.checkWithSoftConstraints(pc)
val model = assertIs<USatResult<UModelBase<Field, Type>>>(status).model
Expand All @@ -186,18 +186,18 @@ class ModelDecodingTest {
heap.writeArrayIndex(symbolicRef1, concreteIdx, array, addressSort, symbolicRef2, trueExpr)
heap.writeArrayIndex(symbolicRef2, concreteIdx, array, addressSort, symbolicRef0, trueExpr)

val readedRef = heap.readArrayIndex(symbolicRef0, concreteIdx, array, addressSort)
val readRef = heap.readArrayIndex(symbolicRef0, concreteIdx, array, addressSort)
pc += symbolicRef0 neq nullRef
pc += symbolicRef1 neq nullRef
pc += symbolicRef2 neq nullRef
pc += readedRef neq symbolicRef1
pc += readRef neq symbolicRef1
pc += symbolicRef0 eq symbolicRef1

val status = solver.checkWithSoftConstraints(pc)
val model = assertIs<USatResult<UModelBase<Field, Type>>>(status).model

assertSame(falseExpr, model.eval(symbolicRef2 eq symbolicRef0))
assertSame(model.eval(readedRef), model.eval(symbolicRef2))
assertSame(model.eval(readRef), model.eval(symbolicRef2))
}

@Test
Expand All @@ -208,9 +208,9 @@ class ModelDecodingTest {

val concreteIdx = mkBv(3)

val readedExpr = heap.readArrayIndex(symbolicRef0, concreteIdx, array, bv32Sort)
val readExpr = heap.readArrayIndex(symbolicRef0, concreteIdx, array, bv32Sort)
pc += symbolicRef0 neq nullRef
pc += readedExpr eq mkBv(42)
pc += readExpr eq mkBv(42)

val status = solver.checkWithSoftConstraints(pc)
val model = assertIs<USatResult<UModelBase<Field, Type>>>(status).model
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ class JcTestResolver(
private val method: JcTypedMethod,
private val classLoader: ClassLoader = ClassLoader.getSystemClassLoader(),
) {
private val resolvedCache = mutableMapOf<Int, Any?>()
private val resolvedCache = mutableMapOf<UConcreteHeapAddress, Any?>()

fun resolveState(): JcParametersState {
// TODO: now we need to explicitly evaluate indices of registers, because we don't have specific ULValues
Expand Down
27 changes: 27 additions & 0 deletions usvm-jvm/src/main/kotlin/org/usvm/machine/JcApplicationGraph.kt
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,31 @@ class JcApplicationGraph(
// maybe there is a better way, but I didn't find it
enclosingClass.toType().declaredMethods.first { it.method == this }
}

private val statementsOfMethodCache = ConcurrentHashMap<JcMethod, Collection<JcInst>>()

override fun statementsOf(method: JcMethod): Sequence<JcInst> =
statementsOfMethodCache
.getOrPut(method) { computeAllStatementsOfMethod(method) }
.asSequence()

private fun computeAllStatementsOfMethod(method: JcMethod): Collection<JcInst> {
val entryStatements = entryPoint(method)
val statements = entryStatements.toMutableSet()

val queue = ArrayDeque(entryStatements.toList())

while (queue.isNotEmpty()) {
val statement = queue.removeLast()
val successors = successors(statement)
for (successor in successors) {
if (successor !in statements) {
statements += successor
queue += successor
}
}
}

return statements
}
}
2 changes: 1 addition & 1 deletion usvm-jvm/src/main/kotlin/org/usvm/machine/JcMachine.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import org.usvm.machine.state.JcState
import org.usvm.ps.BfsPathSelector
import org.usvm.ps.DfsPathSelector
import org.usvm.ps.combinators.ParallelSelector
import org.usvm.ps.stopstregies.TargetsCoveredStoppingStrategy
import org.usvm.ps.stopstrategies.TargetsCoveredStoppingStrategy

class JcMachine(
cp: JcClasspath,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ class JcBinaryOperatorTest {
onBytes = Byte::times,
onChars = { a, b -> a.code * b.code },
onShorts = Short::times,
operatorText = "+",
operatorText = "*",
onInts = Int::times,
onLongs = Long::times,
onFloats = Float::times,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ class JcUnaryOperatorTest {
@Test
fun `Test cast byte to short`() =
testOperator(
JcUnaryOperator.CastToChar,
"(char)",
JcUnaryOperator.CastToShort,
"(short)",
{ it.toInt().toShort() },
::extractShort,
ctx::mkBv,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,9 @@ class SampleApplicationGraph(
}
}

override fun statementsOf(method: Method<*>): Sequence<Stmt> =
method.body?.stmts.orEmpty().asSequence()

override fun predecessors(node: Stmt): Sequence<Stmt> {
val info = lazyGetStmtInfo(node)
return info.predecessors.asSequence()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import org.usvm.language.Method
import org.usvm.language.Program
import org.usvm.language.SampleType
import org.usvm.ps.DfsPathSelector
import org.usvm.ps.stopstregies.CollectedStatesLimitStrategy
import org.usvm.ps.stopstrategies.CollectedStatesLimitStrategy

/**
* Entry point for a sample language analyzer.
Expand Down

0 comments on commit 784c221

Please sign in to comment.