Skip to content

Commit 46586f2

Browse files
committed
Fixed a substitution static fields with unbounded variables
1 parent db3354d commit 46586f2

3 files changed

Lines changed: 16 additions & 4 deletions

File tree

‎utbot-framework-test/src/test/kotlin/org/utbot/examples/annotations/NotNullAnnotationTest.kt‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package org.utbot.examples.annotations
33
import org.junit.jupiter.api.Disabled
44
import org.junit.jupiter.api.Test
55
import org.utbot.testcheckers.eq
6+
import org.utbot.testing.AtLeast
67
import org.utbot.testing.UtValueTestCaseChecker
78

89
internal class NotNullAnnotationTest : UtValueTestCaseChecker(testClass = NotNullAnnotation::class) {
@@ -68,7 +69,8 @@ internal class NotNullAnnotationTest : UtValueTestCaseChecker(testClass = NotNul
6869
checkStatics(
6970
NotNullAnnotation::notNullStaticField,
7071
eq(1),
71-
{ statics, result -> result == statics.values.single().value }
72+
{ statics, result -> result == statics.values.single().value },
73+
coverage = AtLeast(66)
7274
)
7375
}
7476

‎utbot-framework/src/main/kotlin/org/utbot/engine/Memory.kt‎

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ data class Memory( // TODO: split purely symbolic memory and information about s
199199
.mapValues { (_, values) -> values.first().value to values.last().value }
200200

201201
val previousMemoryStates = staticFieldsStates.toMutableMap()
202+
val previousFieldValues = fieldValues.toMutableMap()
202203

203204

204205
/**
@@ -212,6 +213,11 @@ data class Memory( // TODO: split purely symbolic memory and information about s
212213
update.classIdToClearStatics?.let { classId ->
213214
Scene.v().getSootClass(classId.name).fields.forEach { sootField ->
214215
previousMemoryStates.remove(sootField.fieldId)
216+
217+
if (sootField.isStatic) {
218+
// Only statics should be cleared here
219+
previousFieldValues.remove(sootField)
220+
}
215221
}
216222
}
217223

@@ -254,7 +260,7 @@ data class Memory( // TODO: split purely symbolic memory and information about s
254260
initializedStaticFields = initializedStaticFields.addAll(update.initializedStaticFields),
255261
staticFieldsStates = previousMemoryStates.toPersistentMap().putAll(updatedStaticFields),
256262
meaningfulStaticFields = meaningfulStaticFields.addAll(update.meaningfulStaticFields),
257-
fieldValues = fieldValues.putAll(update.fieldValues),
263+
fieldValues = previousFieldValues.toPersistentMap().putAll(update.fieldValues),
258264
addrToArrayType = addrToArrayType.putAll(update.addrToArrayType),
259265
addrToMockInfo = addrToMockInfo.putAll(update.addrToMockInfo),
260266
updates = updates + update,
@@ -278,7 +284,8 @@ data class Memory( // TODO: split purely symbolic memory and information about s
278284
*/
279285
fun queuedStaticMemoryUpdates(): MemoryUpdate = MemoryUpdate(
280286
staticInstanceStorage = updates.staticInstanceStorage,
281-
staticFieldsUpdates = updates.staticFieldsUpdates
287+
staticFieldsUpdates = updates.staticFieldsUpdates,
288+
fieldValues = updates.fieldValues.filter { it.key.isStatic }.toPersistentMap()
282289
)
283290

284291
/**

‎utbot-framework/src/main/kotlin/org/utbot/engine/Traverser.kt‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import kotlinx.collections.immutable.persistentHashSetOf
55
import kotlinx.collections.immutable.persistentListOf
66
import kotlinx.collections.immutable.persistentSetOf
77
import kotlinx.collections.immutable.toPersistentList
8+
import kotlinx.collections.immutable.toPersistentMap
89
import kotlinx.collections.immutable.toPersistentSet
910
import org.utbot.common.WorkaroundReason.HACK
1011
import org.utbot.framework.UtSettings.ignoreStaticsFromTrustedLibraries
@@ -1936,7 +1937,6 @@ class Traverser(
19361937
val touchedStaticFields = persistentListOf(staticFieldMemoryUpdate)
19371938
queuedSymbolicStateUpdates += MemoryUpdate(staticFieldsUpdates = touchedStaticFields)
19381939

1939-
// TODO filter enum constant static fields JIRA:1681
19401940
if (!environment.method.isStaticInitializer && isStaticFieldMeaningful(field)) {
19411941
queuedSymbolicStateUpdates += MemoryUpdate(meaningfulStaticFields = persistentSetOf(fieldId))
19421942
}
@@ -3579,6 +3579,7 @@ class Traverser(
35793579
val declaringClassId = declaringClass.id
35803580

35813581
val staticFieldsUpdates = updates.staticFieldsUpdates.toMutableList()
3582+
val fieldValuesUpdates = updates.fieldValues.toMutableMap()
35823583
val updatedFields = staticFieldsUpdates.mapTo(mutableSetOf()) { it.fieldId }
35833584
val objectUpdates = mutableListOf<UtNamedStore>()
35843585

@@ -3591,6 +3592,7 @@ class Traverser(
35913592
// remove updates from clinit, because we'll replace those values
35923593
// with new unbounded symbolic variable
35933594
staticFieldsUpdates.removeAll { update -> update.fieldId == it.fieldId }
3595+
fieldValuesUpdates.keys.removeAll { key -> key.fieldId == it.fieldId }
35943596

35953597
val value = createConst(it.type, it.name)
35963598
val valueToStore = if (value is ReferenceValue) {
@@ -3610,6 +3612,7 @@ class Traverser(
36103612
return updates.copy(
36113613
stores = updates.stores.addAll(objectUpdates),
36123614
staticFieldsUpdates = staticFieldsUpdates.toPersistentList(),
3615+
fieldValues = fieldValuesUpdates.toPersistentMap(),
36133616
classIdToClearStatics = declaringClassId
36143617
)
36153618
}

0 commit comments

Comments
 (0)