Skip to content

Drop crashed executions #2705

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ fun runUsvmGeneration(
state = state,
stringConstants = jcContainer.machine.stringConstants,
classConstants = jcContainer.machine.classConstants
)
) ?: return@analyzeAsync
}.getOrElse { e ->
logger.error(e) { "executor.execute(${state.entrypoint}) failed" }
return@analyzeAsync
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import org.usvm.instrumentation.executor.UTestConcreteExecutor
import org.usvm.instrumentation.testcase.UTest
import org.usvm.instrumentation.testcase.api.UTestAllocateMemoryCall
import org.usvm.instrumentation.testcase.api.UTestExecutionExceptionResult
import org.usvm.instrumentation.testcase.api.UTestExecutionFailedResult
import org.usvm.instrumentation.testcase.api.UTestExecutionSuccessResult
import org.usvm.instrumentation.testcase.api.UTestExpression
import org.usvm.instrumentation.testcase.api.UTestMethodCall
Expand Down Expand Up @@ -62,7 +63,7 @@ class JcTestExecutor(
state: JcState,
stringConstants: Map<String, UConcreteHeapRef>,
classConstants: Map<JcType, UConcreteHeapRef>,
): JcExecution {
): JcExecution? {
val model = state.models.first()

val ctx = state.ctx
Expand Down Expand Up @@ -99,10 +100,17 @@ class JcTestExecutor(
}
}

// sometimes symbolic result more preferable than concolic: e.g. if concrete times out
val testExecutionResult = concreteResult?.uTestExecutionResult

// Drop crashed executions
if (testExecutionResult is UTestExecutionFailedResult) {
logger.warn { "JVM crash in concrete execution for method ${method.method}, dropping state" }
return null
}

// sometimes symbolic result more preferable than concolic
val preferableResult =
if (concreteResult?.uTestExecutionResult is UTestExecutionSuccessResult
|| concreteResult?.uTestExecutionResult is UTestExecutionExceptionResult) {
if (testExecutionResult is UTestExecutionSuccessResult || testExecutionResult is UTestExecutionExceptionResult) {
concreteResult
} else {
symbolicResult
Expand Down