From 1185f3b2fcf58162d5f8a9e5593e02f1f89db4a2 Mon Sep 17 00:00:00 2001 From: DaniilStepanov Date: Fri, 1 Dec 2023 14:03:10 +0300 Subject: [PATCH] Fix bug with tracing of approximated methods --- usvm-jvm-instrumentation/build.gradle.kts | 1 + .../instrumentation/executor/RdProcessRunner.kt | 13 ++++++++----- .../instrumentation/JcInstructionTracer.kt | 3 +-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/usvm-jvm-instrumentation/build.gradle.kts b/usvm-jvm-instrumentation/build.gradle.kts index df9ff398d2..22642cdf79 100644 --- a/usvm-jvm-instrumentation/build.gradle.kts +++ b/usvm-jvm-instrumentation/build.gradle.kts @@ -43,6 +43,7 @@ kotlin { dependencies { implementation("org.jacodb:jacodb-core:${Versions.jcdb}") implementation("org.jacodb:jacodb-analysis:${Versions.jcdb}") + implementation("org.jacodb:jacodb-approximations:${Versions.jcdb}") implementation("com.jetbrains.rd:rd-framework:${Versions.rd}") implementation("org.ini4j:ini4j:${Versions.ini4j}") diff --git a/usvm-jvm-instrumentation/src/main/kotlin/org/usvm/instrumentation/executor/RdProcessRunner.kt b/usvm-jvm-instrumentation/src/main/kotlin/org/usvm/instrumentation/executor/RdProcessRunner.kt index 1b0dd9daf7..49b53b1b88 100644 --- a/usvm-jvm-instrumentation/src/main/kotlin/org/usvm/instrumentation/executor/RdProcessRunner.kt +++ b/usvm-jvm-instrumentation/src/main/kotlin/org/usvm/instrumentation/executor/RdProcessRunner.kt @@ -10,7 +10,7 @@ import kotlinx.coroutines.delay import org.jacodb.api.JcClassOrInterface import org.jacodb.api.JcClasspath import org.jacodb.api.cfg.JcInst -import org.jacodb.api.ext.methods +import org.jacodb.approximation.JcEnrichedVirtualMethod import org.usvm.instrumentation.generated.models.* import org.usvm.instrumentation.rd.* import org.usvm.instrumentation.util.findFieldByFullNameOrNull @@ -196,13 +196,16 @@ class RdProcessRunner( val jcClass = deserializedClassesCache.getOrPut(classId) { val className = coveredClasses.find { it.classId == classId } - ?: error("Deserialization error") - jcClasspath.findClassOrNull(className.className) ?: error("Deserialization error") + ?: error("Trace deserialization error") + jcClasspath.findClassOrNull(className.className) ?: error("Trace deserialization error") } - val jcMethod = jcClass.methods.sortedBy { it.description }[methodId.toInt()] + if (jcClass.declaredMethods.any { it is JcEnrichedVirtualMethod }) { + return listOf() + } + val jcMethod = jcClass.declaredMethods.sortedBy { it.description }[methodId.toInt()] jcMethod.instList .find { it.location.index == instructionId } - ?: error("Deserialization error") + ?: error("Trace deserialization error") } } diff --git a/usvm-jvm-instrumentation/src/main/kotlin/org/usvm/instrumentation/instrumentation/JcInstructionTracer.kt b/usvm-jvm-instrumentation/src/main/kotlin/org/usvm/instrumentation/instrumentation/JcInstructionTracer.kt index b1d0c25d3b..7632f16f52 100644 --- a/usvm-jvm-instrumentation/src/main/kotlin/org/usvm/instrumentation/instrumentation/JcInstructionTracer.kt +++ b/usvm-jvm-instrumentation/src/main/kotlin/org/usvm/instrumentation/instrumentation/JcInstructionTracer.kt @@ -6,7 +6,6 @@ import org.jacodb.api.JcField import org.jacodb.api.JcMethod import org.jacodb.api.cfg.JcInst import org.jacodb.api.cfg.JcRawFieldRef -import org.jacodb.api.ext.methods import org.usvm.instrumentation.collector.trace.TraceCollector import org.usvm.instrumentation.instrumentation.JcInstructionTracer.StaticFieldAccessType import org.usvm.instrumentation.util.enclosingClass @@ -75,7 +74,7 @@ object JcInstructionTracer : Tracer { private fun encodeMethod(jcClass: JcClassOrInterface, jcMethod: JcMethod): EncodedMethod { val encodedClass = encodeClass(jcClass) - val methodIndex = jcClass.methods + val methodIndex = jcClass.declaredMethods .sortedBy { it.description } .indexOf(jcMethod) .also { if (it == -1) error("Encoding error") }