Skip to content

Commit 24913f1

Browse files
Stepanov/jvm instrumentation persistent descriptors (#112)
* concept of persistent descriptors implemented also minor fixes * assume fix for concrete execution * Now it is possible to run specific classes with specific test resolving strategy * fix of JcType.toJcClass() function * minor
1 parent cb808fb commit 24913f1

10 files changed

Lines changed: 135 additions & 346 deletions

File tree

usvm-jvm-instrumentation/src/main/kotlin/org/usvm/instrumentation/rd/InstrumentedProcess.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,14 @@ class InstrumentedProcess private constructor() {
8181
}
8282

8383
private suspend fun initProcess(classpath: String) {
84-
fileClassPath = classpath.split(':').map { File(it) }
84+
fileClassPath = classpath.split(File.pathSeparatorChar).map { File(it) }
8585
val db = jacodb {
8686
loadByteCode(fileClassPath)
8787
installFeatures(InMemoryHierarchy)
8888
jre = File(InstrumentationModuleConstants.pathToJava)
8989
//persistent(location = "/home/.usvm/jcdb.db", clearOnStart = false)
9090
}
91-
jcClasspath = db.asyncClasspath(fileClassPath).get()
91+
jcClasspath = db.classpath(fileClassPath)
9292
serializationCtx = SerializationContext(jcClasspath)
9393
ucp = URLClassPathLoader(fileClassPath)
9494
uTestExecutor = UTestExecutor(jcClasspath, ucp)

usvm-jvm-instrumentation/src/main/kotlin/org/usvm/instrumentation/rd/UTestExecutor.kt

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@ import org.usvm.instrumentation.instrumentation.JcInstructionTracer
1111
import org.usvm.instrumentation.mock.MockHelper
1212
import org.usvm.instrumentation.testcase.UTest
1313
import org.usvm.instrumentation.testcase.api.*
14-
import org.usvm.instrumentation.testcase.descriptor.StaticDescriptorsBuilder
15-
import org.usvm.instrumentation.testcase.descriptor.UTestExceptionDescriptor
16-
import org.usvm.instrumentation.testcase.descriptor.Value2DescriptorConverter
14+
import org.usvm.instrumentation.testcase.descriptor.*
1715
import org.usvm.instrumentation.testcase.executor.UTestExpressionExecutor
1816
import org.usvm.instrumentation.util.InstrumentationModuleConstants
1917
import org.usvm.instrumentation.util.URLClassPathLoader
@@ -94,15 +92,6 @@ class UTestExecutor(
9492
accessedStatics = hashSetOf()
9593
)
9694

97-
executor.clearCache()
98-
executor.executeUTestInsts(uTest.initStatements)
99-
?.onFailure {
100-
return UTestExecutionInitFailedResult(
101-
cause = buildExceptionDescriptor(initStateDescriptorBuilder, it, false),
102-
trace = JcInstructionTracer.getTrace().trace
103-
)
104-
}
105-
10695
val methodInvocationResult =
10796
executor.executeUTestInst(callMethodExpr)
10897
val resultStateDescriptorBuilder =
@@ -157,7 +146,8 @@ class UTestExecutor(
157146
exception: Throwable,
158147
raisedByUserCode: Boolean
159148
): UTestExceptionDescriptor {
160-
val descriptor = builder.buildDescriptorResultFromAny(any = exception, type = null).getOrNull() as? UTestExceptionDescriptor
149+
val descriptor =
150+
builder.buildDescriptorResultFromAny(any = exception, type = null).getOrNull() as? UTestExceptionDescriptor
161151
return descriptor
162152
?.also { it.raisedByUserCode = raisedByUserCode }
163153
?: UTestExceptionDescriptor(
@@ -174,14 +164,14 @@ class UTestExecutor(
174164
descriptorBuilder: Value2DescriptorConverter,
175165
accessedStatics: MutableSet<Pair<JcField, JcInstructionTracer.StaticFieldAccessType>>
176166
): UTestExecutionState = with(descriptorBuilder) {
177-
descriptorBuilder.uTestExecutorCache.addAll(executor.objectToInstructionsCache)
167+
uTestExecutorCache.addAll(executor.objectToInstructionsCache)
178168
val instanceDescriptor = callMethodExpr.instance?.let {
179169
buildDescriptorFromUTestExpr(it, executor).getOrNull()
180170
}
181171
val argsDescriptors = callMethodExpr.args.map {
182172
buildDescriptorFromUTestExpr(it, executor).getOrNull()
183173
}
184-
val isInit = descriptorBuilder.previousState == null
174+
val isInit = previousState == null
185175
val statics = if (isInit) {
186176
staticDescriptorsBuilder.builtInitialDescriptors
187177
.mapValues { it.value!! }

usvm-jvm-instrumentation/src/main/kotlin/org/usvm/instrumentation/serializer/UTestValueDescriptorSerializer.kt

Lines changed: 7 additions & 175 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,7 @@ class UTestValueDescriptorSerializer(private val ctx: SerializationContext) {
3838
UTestValueDescriptorKind.NULL -> deserializeNull()
3939
UTestValueDescriptorKind.STRING -> deserializeString()
4040
UTestValueDescriptorKind.CYCLIC_REF -> deserializeCyclicRef()
41-
UTestValueDescriptorKind.INT_ARRAY -> deserializeIntArray()
42-
UTestValueDescriptorKind.BOOLEAN_ARRAY -> deserializeBooleanArray()
43-
UTestValueDescriptorKind.BYTE_ARRAY -> deserializeByteArray()
44-
UTestValueDescriptorKind.SHORT_ARRAY -> deserializeShortArray()
45-
UTestValueDescriptorKind.LONG_ARRAY -> deserializeLongArray()
46-
UTestValueDescriptorKind.DOUBLE_ARRAY -> deserializeDoubleArray()
47-
UTestValueDescriptorKind.FLOAT_ARRAY -> deserializeFloatArray()
48-
UTestValueDescriptorKind.CHAR_ARRAY -> deserializeCharArray()
49-
UTestValueDescriptorKind.OBJECT_ARRAY -> deserializeArray()
41+
UTestValueDescriptorKind.ARRAY -> deserializeArray()
5042
UTestValueDescriptorKind.ENUM_VALUE -> deserializeEnumValue()
5143
UTestValueDescriptorKind.CLASS -> deserializeClass()
5244
UTestValueDescriptorKind.EXCEPTION -> deserializeException()
@@ -59,16 +51,8 @@ class UTestValueDescriptorSerializer(private val ctx: SerializationContext) {
5951
private fun AbstractBuffer.serializeUTestValueDescriptor(uTestValueDescriptor: UTestValueDescriptor) {
6052
if (ctx.serializedDescriptors.contains(uTestValueDescriptor)) return
6153
when (uTestValueDescriptor) {
62-
is UTestArrayDescriptor.Array -> serialize(uTestValueDescriptor)
63-
is UTestArrayDescriptor.BooleanArray -> serialize(uTestValueDescriptor)
64-
is UTestArrayDescriptor.ByteArray -> serialize(uTestValueDescriptor)
65-
is UTestArrayDescriptor.CharArray -> serialize(uTestValueDescriptor)
66-
is UTestArrayDescriptor.DoubleArray -> serialize(uTestValueDescriptor)
67-
is UTestArrayDescriptor.FloatArray -> serialize(uTestValueDescriptor)
68-
is UTestArrayDescriptor.IntArray -> serialize(uTestValueDescriptor)
69-
is UTestArrayDescriptor.LongArray -> serialize(uTestValueDescriptor)
70-
is UTestArrayDescriptor.ShortArray -> serialize(uTestValueDescriptor)
7154
is UTestConstantDescriptor.Boolean -> serialize(uTestValueDescriptor)
55+
is UTestArrayDescriptor -> serialize(uTestValueDescriptor)
7256
is UTestConstantDescriptor.Byte -> serialize(uTestValueDescriptor)
7357
is UTestConstantDescriptor.Char -> serialize(uTestValueDescriptor)
7458
is UTestConstantDescriptor.Double -> serialize(uTestValueDescriptor)
@@ -86,10 +70,10 @@ class UTestValueDescriptorSerializer(private val ctx: SerializationContext) {
8670
}
8771
}
8872

89-
private fun AbstractBuffer.serialize(uTestValueDescriptor: UTestArrayDescriptor.Array) =
73+
private fun AbstractBuffer.serialize(uTestValueDescriptor: UTestArrayDescriptor) =
9074
serialize(
9175
uTestValueDescriptor = uTestValueDescriptor,
92-
kind = UTestValueDescriptorKind.OBJECT_ARRAY,
76+
kind = UTestValueDescriptorKind.ARRAY,
9377
serializeInternals = {
9478
value.forEach { serializeUTestValueDescriptor(it) }
9579
},
@@ -101,163 +85,19 @@ class UTestValueDescriptorSerializer(private val ctx: SerializationContext) {
10185
}
10286
)
10387

104-
private fun AbstractBuffer.deserializeArray(): UTestArrayDescriptor.Array {
88+
private fun AbstractBuffer.deserializeArray(): UTestArrayDescriptor {
10589
val elementType = readJcType(jcClasspath) ?: jcClasspath.objectType
10690
val refId = readInt()
10791
val length = readInt()
10892
val values = readList { readUTestValueDescriptor() }
109-
return UTestArrayDescriptor.Array(
93+
return UTestArrayDescriptor(
11094
elementType = elementType,
11195
length = length,
11296
value = values,
11397
refId = refId
11498
)
11599
}
116100

117-
private fun AbstractBuffer.serialize(uTestValueDescriptor: UTestArrayDescriptor.BooleanArray) =
118-
serialize(
119-
uTestValueDescriptor = uTestValueDescriptor,
120-
kind = UTestValueDescriptorKind.BOOLEAN_ARRAY,
121-
serializeInternals = {},
122-
serialize = {
123-
writeInt(length)
124-
writeBooleanArray(value)
125-
}
126-
)
127-
128-
private fun AbstractBuffer.deserializeBooleanArray(): UTestArrayDescriptor.BooleanArray =
129-
UTestArrayDescriptor.BooleanArray(
130-
elementType = jcClasspath.boolean,
131-
length = readInt(),
132-
value = readBooleanArray()
133-
)
134-
135-
private fun AbstractBuffer.serialize(uTestValueDescriptor: UTestArrayDescriptor.ByteArray) =
136-
serialize(
137-
uTestValueDescriptor = uTestValueDescriptor,
138-
kind = UTestValueDescriptorKind.BYTE_ARRAY,
139-
serializeInternals = {},
140-
serialize = {
141-
writeInt(length)
142-
writeByteArray(value)
143-
}
144-
)
145-
146-
private fun AbstractBuffer.deserializeByteArray(): UTestArrayDescriptor.ByteArray =
147-
UTestArrayDescriptor.ByteArray(
148-
elementType = jcClasspath.byte,
149-
length = readInt(),
150-
value = readByteArray()
151-
)
152-
153-
private fun AbstractBuffer.serialize(uTestValueDescriptor: UTestArrayDescriptor.ShortArray) =
154-
serialize(
155-
uTestValueDescriptor = uTestValueDescriptor,
156-
kind = UTestValueDescriptorKind.SHORT_ARRAY,
157-
serializeInternals = {},
158-
serialize = {
159-
writeInt(length)
160-
writeShortArray(value)
161-
}
162-
)
163-
164-
private fun AbstractBuffer.deserializeShortArray(): UTestArrayDescriptor.ShortArray =
165-
UTestArrayDescriptor.ShortArray(
166-
elementType = jcClasspath.short,
167-
length = readInt(),
168-
value = readShortArray()
169-
)
170-
171-
private fun AbstractBuffer.serialize(uTestValueDescriptor: UTestArrayDescriptor.IntArray) =
172-
serialize(
173-
uTestValueDescriptor = uTestValueDescriptor,
174-
kind = UTestValueDescriptorKind.INT_ARRAY,
175-
serializeInternals = {},
176-
serialize = {
177-
writeInt(length)
178-
writeIntArray(value)
179-
}
180-
)
181-
182-
private fun AbstractBuffer.deserializeIntArray(): UTestArrayDescriptor.IntArray =
183-
UTestArrayDescriptor.IntArray(
184-
elementType = jcClasspath.int,
185-
length = readInt(),
186-
value = readIntArray()
187-
)
188-
189-
private fun AbstractBuffer.serialize(uTestValueDescriptor: UTestArrayDescriptor.LongArray) =
190-
serialize(
191-
uTestValueDescriptor = uTestValueDescriptor,
192-
kind = UTestValueDescriptorKind.LONG_ARRAY,
193-
serializeInternals = {},
194-
serialize = {
195-
writeInt(length)
196-
writeLongArray(value)
197-
}
198-
)
199-
200-
private fun AbstractBuffer.deserializeLongArray(): UTestArrayDescriptor.LongArray =
201-
UTestArrayDescriptor.LongArray(
202-
elementType = jcClasspath.long,
203-
length = readInt(),
204-
value = readLongArray()
205-
)
206-
207-
private fun AbstractBuffer.serialize(uTestValueDescriptor: UTestArrayDescriptor.FloatArray) =
208-
serialize(
209-
uTestValueDescriptor = uTestValueDescriptor,
210-
kind = UTestValueDescriptorKind.FLOAT_ARRAY,
211-
serializeInternals = {},
212-
serialize = {
213-
writeInt(length)
214-
writeFloatArray(value)
215-
}
216-
)
217-
218-
private fun AbstractBuffer.deserializeFloatArray(): UTestArrayDescriptor.FloatArray =
219-
UTestArrayDescriptor.FloatArray(
220-
elementType = jcClasspath.float,
221-
length = readInt(),
222-
value = readFloatArray()
223-
)
224-
225-
private fun AbstractBuffer.serialize(uTestValueDescriptor: UTestArrayDescriptor.DoubleArray) =
226-
serialize(
227-
uTestValueDescriptor = uTestValueDescriptor,
228-
kind = UTestValueDescriptorKind.DOUBLE_ARRAY,
229-
serializeInternals = {},
230-
serialize = {
231-
writeInt(length)
232-
writeDoubleArray(value)
233-
}
234-
)
235-
236-
private fun AbstractBuffer.deserializeDoubleArray(): UTestArrayDescriptor.DoubleArray =
237-
UTestArrayDescriptor.DoubleArray(
238-
elementType = jcClasspath.double,
239-
length = readInt(),
240-
value = readDoubleArray()
241-
)
242-
243-
private fun AbstractBuffer.serialize(uTestValueDescriptor: UTestArrayDescriptor.CharArray) =
244-
serialize(
245-
uTestValueDescriptor = uTestValueDescriptor,
246-
kind = UTestValueDescriptorKind.CHAR_ARRAY,
247-
serializeInternals = {},
248-
serialize = {
249-
writeInt(length)
250-
writeCharArray(value)
251-
}
252-
)
253-
254-
private fun AbstractBuffer.deserializeCharArray(): UTestArrayDescriptor.CharArray =
255-
UTestArrayDescriptor.CharArray(
256-
elementType = jcClasspath.char,
257-
length = readInt(),
258-
value = readCharArray()
259-
)
260-
261101
private fun AbstractBuffer.serialize(uTestValueDescriptor: UTestCyclicReferenceDescriptor) =
262102
serialize(
263103
uTestValueDescriptor = uTestValueDescriptor,
@@ -531,15 +371,7 @@ class UTestValueDescriptorSerializer(private val ctx: SerializationContext) {
531371
CHAR,
532372
NULL,
533373
STRING,
534-
INT_ARRAY,
535-
BOOLEAN_ARRAY,
536-
BYTE_ARRAY,
537-
SHORT_ARRAY,
538-
LONG_ARRAY,
539-
DOUBLE_ARRAY,
540-
FLOAT_ARRAY,
541-
CHAR_ARRAY,
542-
OBJECT_ARRAY,
374+
ARRAY,
543375
CYCLIC_REF,
544376
ENUM_VALUE,
545377
CLASS,

0 commit comments

Comments
 (0)