@@ -106,6 +106,7 @@ import org.utbot.engine.symbolic.asHardConstraint
106
106
import org.utbot.engine.symbolic.asSoftConstraint
107
107
import org.utbot.engine.symbolic.asAssumption
108
108
import org.utbot.engine.symbolic.asUpdate
109
+ import org.utbot.engine.util.trusted.isFromTrustedLibrary
109
110
import org.utbot.engine.util.mockListeners.MockListener
110
111
import org.utbot.engine.util.mockListeners.MockListenerController
111
112
import org.utbot.engine.util.statics.concrete.associateEnumSootFieldsWithConcreteValues
@@ -116,7 +117,7 @@ import org.utbot.engine.util.statics.concrete.makeEnumStaticFieldsUpdates
116
117
import org.utbot.engine.util.statics.concrete.makeSymbolicValuesFromEnumConcreteValues
117
118
import org.utbot.framework.PathSelectorType
118
119
import org.utbot.framework.UtSettings
119
- import org.utbot.framework.UtSettings.checkNpeForFinalFields
120
+ import org.utbot.framework.UtSettings.maximizeCoverageUsingReflection
120
121
import org.utbot.framework.UtSettings.checkSolverTimeoutMillis
121
122
import org.utbot.framework.UtSettings.enableFeatureProcess
122
123
import org.utbot.framework.UtSettings.pathSelectorStepsLimit
@@ -339,7 +340,13 @@ class UtBotSymbolicEngine(
339
340
340
341
private val classUnderTest: ClassId = methodUnderTest.clazz.id
341
342
342
- private val mocker: Mocker = Mocker (mockStrategy, classUnderTest, hierarchy, chosenClassesToMockAlways, MockListenerController (controller))
343
+ private val mocker: Mocker = Mocker (
344
+ mockStrategy,
345
+ classUnderTest,
346
+ hierarchy,
347
+ chosenClassesToMockAlways,
348
+ MockListenerController (controller)
349
+ )
343
350
344
351
private val statesForConcreteExecution: MutableList <ExecutionState > = mutableListOf ()
345
352
@@ -2250,14 +2257,37 @@ class UtBotSymbolicEngine(
2250
2257
}
2251
2258
2252
2259
// See docs/SpeculativeFieldNonNullability.md for details
2253
- if (field.isFinal && field.declaringClass.isLibraryClass && ! checkNpeForFinalFields) {
2254
- markAsSpeculativelyNotNull(createdField.addr)
2255
- }
2260
+ checkAndMarkLibraryFieldSpeculativelyNotNull(field, createdField)
2256
2261
}
2257
2262
2258
2263
return createdField
2259
2264
}
2260
2265
2266
+ /* *
2267
+ * Marks the [createdField] as speculatively not null if the [field] is considering as
2268
+ * not producing [NullPointerException].
2269
+ *
2270
+ * @see [SootField.speculativelyCannotProduceNullPointerException], [markAsSpeculativelyNotNull], [isFromTrustedLibrary].
2271
+ */
2272
+ private fun checkAndMarkLibraryFieldSpeculativelyNotNull (field : SootField , createdField : SymbolicValue ) {
2273
+ if (maximizeCoverageUsingReflection || ! field.declaringClass.isFromTrustedLibrary()) {
2274
+ return
2275
+ }
2276
+
2277
+ if (field.speculativelyCannotProduceNullPointerException()) {
2278
+ markAsSpeculativelyNotNull(createdField.addr)
2279
+ }
2280
+ }
2281
+
2282
+ /* *
2283
+ * Checks whether accessing [this] field (with a method invocation or field access) speculatively can produce
2284
+ * [NullPointerException] (according to its finality or accessibility).
2285
+ *
2286
+ * @see docs/SpeculativeFieldNonNullability.md for more information.
2287
+ */
2288
+ @Suppress(" KDocUnresolvedReference" )
2289
+ private fun SootField.speculativelyCannotProduceNullPointerException (): Boolean = isFinal || ! isPublic
2290
+
2261
2291
private fun createArray (pName : String , type : ArrayType ): ArrayValue {
2262
2292
val addr = UtAddrExpression (mkBVConst(pName, UtIntSort ))
2263
2293
return createArray(addr, type, useConcreteType = false )
0 commit comments