Skip to content

Commit 0ae694d

Browse files
committed
Disabled NPE checks for non-public fields in non-application classes by default
1 parent 0fb3fc3 commit 0ae694d

File tree

2 files changed

+24
-8
lines changed

2 files changed

+24
-8
lines changed

utbot-framework-api/src/main/kotlin/org/utbot/framework/UtSettings.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,13 +176,22 @@ object UtSettings {
176176
var enableMachineLearningModule by getBooleanProperty(true)
177177

178178
/**
179-
* Options below regulate which NullPointerExceptions check should be performed.
179+
* Options below regulate which [NullPointerException] check should be performed.
180180
*
181181
* Set an option in true if you want to perform NPE check in the corresponding situations, otherwise set false.
182182
*/
183183
var checkNpeInNestedMethods by getBooleanProperty(true)
184184
var checkNpeInNestedNotPrivateMethods by getBooleanProperty(false)
185-
var checkNpeForFinalFields by getBooleanProperty(false)
185+
186+
/**
187+
* This option determines whether should we generate [NullPointerException] checks for final or non-public fields
188+
* in non-application classes. Set by true, this option highly decreases test's readability in some cases
189+
* because of using reflection API for setting final/non-public fields in non-application classes.
190+
*
191+
* NOTE: default false value loses some executions with NPE in system classes, but often most of these executions
192+
* are not expected by user.
193+
*/
194+
var maximizeCoverageUsingReflection by getBooleanProperty(false)
186195

187196
/**
188197
* Activate or deactivate substituting static fields values set in static initializer

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

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ import org.utbot.engine.symbolic.asSoftConstraint
107107
import org.utbot.engine.symbolic.asAssumption
108108
import org.utbot.engine.symbolic.asUpdate
109109
import org.utbot.engine.util.mockListeners.MockListener
110-
import org.utbot.engine.util.mockListeners.MockListenerController
111110
import org.utbot.engine.util.statics.concrete.associateEnumSootFieldsWithConcreteValues
112111
import org.utbot.engine.util.statics.concrete.isEnumAffectingExternalStatics
113112
import org.utbot.engine.util.statics.concrete.isEnumValuesFieldName
@@ -116,7 +115,7 @@ import org.utbot.engine.util.statics.concrete.makeEnumStaticFieldsUpdates
116115
import org.utbot.engine.util.statics.concrete.makeSymbolicValuesFromEnumConcreteValues
117116
import org.utbot.framework.PathSelectorType
118117
import org.utbot.framework.UtSettings
119-
import org.utbot.framework.UtSettings.checkNpeForFinalFields
118+
import org.utbot.framework.UtSettings.maximizeCoverageUsingReflection
120119
import org.utbot.framework.UtSettings.checkSolverTimeoutMillis
121120
import org.utbot.framework.UtSettings.enableFeatureProcess
122121
import org.utbot.framework.UtSettings.pathSelectorStepsLimit
@@ -339,7 +338,7 @@ class UtBotSymbolicEngine(
339338

340339
private val classUnderTest: ClassId = methodUnderTest.clazz.id
341340

342-
private val mocker: Mocker = Mocker(mockStrategy, classUnderTest, hierarchy, chosenClassesToMockAlways, MockListenerController(controller))
341+
private val mocker: Mocker = Mocker(mockStrategy, classUnderTest, hierarchy, chosenClassesToMockAlways)
343342

344343
private val statesForConcreteExecution: MutableList<ExecutionState> = mutableListOf()
345344

@@ -2223,14 +2222,22 @@ class UtBotSymbolicEngine(
22232222
}
22242223

22252224
// See docs/SpeculativeFieldNonNullability.md for details
2226-
if (field.isFinal && field.declaringClass.isLibraryClass && !checkNpeForFinalFields) {
2227-
markAsSpeculativelyNotNull(createdField.addr)
2228-
}
2225+
checkAndMarkLibraryFieldSpeculativelyNotNull(field, createdField)
22292226
}
22302227

22312228
return createdField
22322229
}
22332230

2231+
private fun checkAndMarkLibraryFieldSpeculativelyNotNull(field: SootField, createdField: SymbolicValue) {
2232+
if (maximizeCoverageUsingReflection || !field.declaringClass.isLibraryClass) {
2233+
return
2234+
}
2235+
2236+
if (field.isFinal || !field.isPublic) {
2237+
markAsSpeculativelyNotNull(createdField.addr)
2238+
}
2239+
}
2240+
22342241
private fun createArray(pName: String, type: ArrayType): ArrayValue {
22352242
val addr = UtAddrExpression(mkBVConst(pName, UtIntSort))
22362243
return createArray(addr, type, useConcreteType = false)

0 commit comments

Comments
 (0)