Skip to content

Commit 2798f2b

Browse files
Prohibit to set static final fields from library classes
1 parent ee27905 commit 2798f2b

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ data class Memory( // TODO: split purely symbolic memory and information about s
124124
private val concrete: PersistentMap<UtAddrExpression, Concrete> = persistentHashMapOf(),
125125
private val mockInfos: PersistentList<MockInfoEnriched> = persistentListOf(),
126126
private val staticInstanceStorage: PersistentMap<ClassId, ObjectValue> = persistentHashMapOf(),
127-
private val initializedStaticFields: PersistentMap<FieldId, Any?> = persistentHashMapOf(),
127+
private val initializedStaticFields: PersistentSet<FieldId> = persistentHashSetOf(),
128128
private val staticFieldsStates: PersistentMap<FieldId, FieldStates> = persistentHashMapOf(),
129129
private val meaningfulStaticFields: PersistentSet<FieldId> = persistentHashSetOf(),
130130
private val addrToArrayType: PersistentMap<UtAddrExpression, ArrayType> = persistentHashMapOf(),
@@ -290,7 +290,7 @@ data class Memory( // TODO: split purely symbolic memory and information about s
290290
concrete = concrete.putAll(update.concrete),
291291
mockInfos = mockInfos.mergeWithUpdate(update.mockInfos),
292292
staticInstanceStorage = staticInstanceStorage.putAll(update.staticInstanceStorage),
293-
initializedStaticFields = initializedStaticFields.putAll(update.initializedStaticFields),
293+
initializedStaticFields = initializedStaticFields.addAll(update.initializedStaticFields),
294294
staticFieldsStates = previousMemoryStates.toPersistentMap().putAll(updatedStaticFields),
295295
meaningfulStaticFields = meaningfulStaticFields.addAll(update.meaningfulStaticFields),
296296
addrToArrayType = addrToArrayType.putAll(update.addrToArrayType),
@@ -963,7 +963,7 @@ data class MemoryUpdate(
963963
val concrete: PersistentMap<UtAddrExpression, Concrete> = persistentHashMapOf(),
964964
val mockInfos: PersistentList<MockInfoEnriched> = persistentListOf(),
965965
val staticInstanceStorage: PersistentMap<ClassId, ObjectValue> = persistentHashMapOf(),
966-
val initializedStaticFields: PersistentMap<FieldId, Any?> = persistentHashMapOf(),
966+
val initializedStaticFields: PersistentSet<FieldId> = persistentHashSetOf(),
967967
val staticFieldsUpdates: PersistentList<StaticFieldMemoryUpdateInfo> = persistentListOf(),
968968
val meaningfulStaticFields: PersistentSet<FieldId> = persistentHashSetOf(),
969969
val addrToArrayType: PersistentMap<UtAddrExpression, ArrayType> = persistentHashMapOf(),
@@ -982,7 +982,7 @@ data class MemoryUpdate(
982982
concrete = concrete.putAll(other.concrete),
983983
mockInfos = mockInfos.mergeWithUpdate(other.mockInfos),
984984
staticInstanceStorage = staticInstanceStorage.putAll(other.staticInstanceStorage),
985-
initializedStaticFields = initializedStaticFields.putAll(other.initializedStaticFields),
985+
initializedStaticFields = initializedStaticFields.addAll(other.initializedStaticFields),
986986
staticFieldsUpdates = staticFieldsUpdates.addAll(other.staticFieldsUpdates),
987987
meaningfulStaticFields = meaningfulStaticFields.addAll(other.meaningfulStaticFields),
988988
addrToArrayType = addrToArrayType.putAll(other.addrToArrayType),

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

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package org.utbot.engine
22

33
import kotlinx.collections.immutable.persistentHashMapOf
4+
import kotlinx.collections.immutable.persistentHashSetOf
45
import kotlinx.collections.immutable.persistentListOf
56
import kotlinx.collections.immutable.persistentSetOf
67
import kotlinx.collections.immutable.toPersistentList
7-
import kotlinx.collections.immutable.toPersistentMap
88
import kotlinx.collections.immutable.toPersistentSet
99
import org.utbot.common.WorkaroundReason.HACK
1010
import org.utbot.common.WorkaroundReason.REMOVE_ANONYMOUS_CLASSES
@@ -112,6 +112,7 @@ import soot.DoubleType
112112
import soot.FloatType
113113
import soot.IntType
114114
import soot.LongType
115+
import soot.Modifier
115116
import soot.PrimType
116117
import soot.RefLikeType
117118
import soot.RefType
@@ -560,7 +561,7 @@ class Traverser(
560561
}
561562

562563
val initializedStaticFieldsMemoryUpdate = MemoryUpdate(
563-
initializedStaticFields = staticFields.associate { it.first.fieldId to it.second.single() }.toPersistentMap(),
564+
initializedStaticFields = staticFields.map { it.first.fieldId }.toPersistentSet(),
564565
meaningfulStaticFields = meaningfulStaticFields.map { it.first.fieldId }.toPersistentSet(),
565566
symbolicEnumValues = enumConstantSymbolicValues.toPersistentList()
566567
)
@@ -596,7 +597,7 @@ class Traverser(
596597

597598
// Collects memory updates
598599
val initializedFieldUpdate =
599-
MemoryUpdate(initializedStaticFields = persistentHashMapOf(fieldId to concreteValue))
600+
MemoryUpdate(initializedStaticFields = persistentHashSetOf(fieldId))
600601

601602
val objectUpdate = objectUpdate(
602603
instance = findOrCreateStaticObject(declaringClass.type),
@@ -823,7 +824,7 @@ class Traverser(
823824
val staticFieldMemoryUpdate = StaticFieldMemoryUpdateInfo(fieldId, value)
824825
val touchedStaticFields = persistentListOf(staticFieldMemoryUpdate)
825826
queuedSymbolicStateUpdates += MemoryUpdate(staticFieldsUpdates = touchedStaticFields)
826-
if (!environment.method.isStaticInitializer && !fieldId.isSynthetic) {
827+
if (!environment.method.isStaticInitializer && isStaticFieldMeaningful(left.field)) {
827828
queuedSymbolicStateUpdates += MemoryUpdate(meaningfulStaticFields = persistentSetOf(fieldId))
828829
}
829830
}
@@ -1780,13 +1781,19 @@ class Traverser(
17801781
queuedSymbolicStateUpdates += MemoryUpdate(staticFieldsUpdates = touchedStaticFields)
17811782

17821783
// TODO filter enum constant static fields JIRA:1681
1783-
if (!environment.method.isStaticInitializer && !fieldId.isSynthetic) {
1784+
if (!environment.method.isStaticInitializer && isStaticFieldMeaningful(field)) {
17841785
queuedSymbolicStateUpdates += MemoryUpdate(meaningfulStaticFields = persistentSetOf(fieldId))
17851786
}
17861787

17871788
return createdField
17881789
}
17891790

1791+
private fun isStaticFieldMeaningful(field: SootField) =
1792+
!Modifier.isSynthetic(field.modifiers) &&
1793+
// we don't want to set fields from library classes
1794+
!javaPackagesToProcessConcretely.any { field.declaringClass.packageName.startsWith(it) } &&
1795+
!sunPackagesToProcessConcretely.any { field.declaringClass.packageName.startsWith(it) }
1796+
17901797
/**
17911798
* Locates object represents static fields of particular class.
17921799
*

0 commit comments

Comments
 (0)