@@ -26,6 +26,7 @@ import org.usvm.instrumentation.executor.UTestConcreteExecutor
26
26
import org.usvm.instrumentation.testcase.UTest
27
27
import org.usvm.instrumentation.testcase.api.UTestAllocateMemoryCall
28
28
import org.usvm.instrumentation.testcase.api.UTestExecutionExceptionResult
29
+ import org.usvm.instrumentation.testcase.api.UTestExecutionFailedResult
29
30
import org.usvm.instrumentation.testcase.api.UTestExecutionSuccessResult
30
31
import org.usvm.instrumentation.testcase.api.UTestExpression
31
32
import org.usvm.instrumentation.testcase.api.UTestMethodCall
@@ -62,7 +63,7 @@ class JcTestExecutor(
62
63
state : JcState ,
63
64
stringConstants : Map <String , UConcreteHeapRef >,
64
65
classConstants : Map <JcType , UConcreteHeapRef >,
65
- ): JcExecution {
66
+ ): JcExecution ? {
66
67
val model = state.models.first()
67
68
68
69
val ctx = state.ctx
@@ -99,10 +100,17 @@ class JcTestExecutor(
99
100
}
100
101
}
101
102
102
- // sometimes symbolic result more preferable than concolic: e.g. if concrete times out
103
+ val testExecutionResult = concreteResult?.uTestExecutionResult
104
+
105
+ // Drop crashed executions
106
+ if (testExecutionResult is UTestExecutionFailedResult ) {
107
+ logger.warn { " JVM crash in concrete execution for method ${method.method} , dropping state" }
108
+ return null
109
+ }
110
+
111
+ // sometimes symbolic result more preferable than concolic
103
112
val preferableResult =
104
- if (concreteResult?.uTestExecutionResult is UTestExecutionSuccessResult
105
- || concreteResult?.uTestExecutionResult is UTestExecutionExceptionResult ) {
113
+ if (testExecutionResult is UTestExecutionSuccessResult || testExecutionResult is UTestExecutionExceptionResult ) {
106
114
concreteResult
107
115
} else {
108
116
symbolicResult
0 commit comments