Skip to content
Draft
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
1 change: 1 addition & 0 deletions src/main/resources/z3config.smt2
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
(set-option :smt.qi.eager_threshold 100)
(set-option :smt.arith.solver 2)
(set-option :model.v2 true)
(set-option :model.partial true)

; We want unlimited multipatterns
(set-option :smt.qi.max_multi_patterns 1000)
1,263 changes: 1,263 additions & 0 deletions src/main/scala/reporting/SiliconExtendedCounterexample.scala

Large diffs are not rendered by default.

5 changes: 4 additions & 1 deletion src/main/scala/rules/SymbolicExecutionRules.scala
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ package viper.silicon.rules

import viper.silicon.debugger.DebugExp
import viper.silicon.interfaces.{Failure, SiliconDebuggingFailureContext, SiliconFailureContext, SiliconMappedCounterexample, SiliconNativeCounterexample, SiliconVariableCounterexample}
import viper.silicon.reporting.SiliconExtendedCounterexample
import viper.silicon.state.State
import viper.silicon.state.terms.{False, Term}
import viper.silicon.verifier.Verifier
import viper.silver.frontend.{ExtendedModel, IntermediateModel, MappedModel, NativeModel, VariablesModel}
import viper.silver.ast
import viper.silver.frontend.{MappedModel, NativeModel, VariablesModel}
import viper.silver.verifier.errors.ErrorWrapperWithExampleTransformer
import viper.silver.verifier.{Counterexample, CounterexampleTransformer, VerificationError}

Expand Down Expand Up @@ -69,6 +70,8 @@ trait SymbolicExecutionRules {
SiliconVariableCounterexample(s.g, nativeModel)
case MappedModel =>
SiliconMappedCounterexample(s.g, s.h.values, s.oldHeaps, nativeModel, s.program)
case IntermediateModel => SiliconExtendedCounterexample(nativeModel, s.g, s.h.values, s.oldHeaps, s.program).imCE
case ExtendedModel => SiliconExtendedCounterexample(nativeModel, s.g, s.h.values, s.oldHeaps, s.program)
}
val finalCE = ceTrafo match {
case Some(trafo) => trafo.f(ce)
Expand Down
13 changes: 0 additions & 13 deletions src/test/resources/counterexamples/cyclic-ref.vpr

This file was deleted.

16 changes: 0 additions & 16 deletions src/test/resources/counterexamples/functions.vpr

This file was deleted.

27 changes: 0 additions & 27 deletions src/test/resources/counterexamples/lseg.vpr

This file was deleted.

19 changes: 0 additions & 19 deletions src/test/resources/counterexamples/method-call.vpr

This file was deleted.

10 changes: 0 additions & 10 deletions src/test/resources/counterexamples/negative.vpr

This file was deleted.

11 changes: 0 additions & 11 deletions src/test/resources/counterexamples/permissions.vpr

This file was deleted.

27 changes: 0 additions & 27 deletions src/test/resources/counterexamples/predicate.vpr

This file was deleted.

12 changes: 0 additions & 12 deletions src/test/resources/counterexamples/ref-sequence.vpr

This file was deleted.

14 changes: 0 additions & 14 deletions src/test/resources/counterexamples/sequence.vpr

This file was deleted.

27 changes: 0 additions & 27 deletions src/test/resources/counterexamples/simple-refs-rec.vpr

This file was deleted.

21 changes: 0 additions & 21 deletions src/test/resources/counterexamples/simple-refs.vpr

This file was deleted.

26 changes: 26 additions & 0 deletions src/test/scala/GeneralCounterexampleTests.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
//
// Copyright (c) 2011-2025 ETH Zurich.

package viper.silicon.tests

import viper.silicon.Silicon
import viper.silver.testing.{CounterexampleTestInput, DefaultAnnotatedTestInput}

import java.nio.file.Path

class GeneralCounterexampleTests extends SiliconTests {
override val testDirectories: Seq[String] = Seq("counterexample_mapped", "counterexample_general")

override def configureVerifiersFromConfigMap(configMap: Map[String, Any]): Unit = {
val args = Silicon.optionsFromScalaTestConfigMap(prefixSpecificConfigMap(configMap).getOrElse("silicon", Map()))
val additionalArgs = Seq("--counterexample", "extended")

silicon.parseCommandLine(args ++ additionalArgs :+ Silicon.dummyInputFilename)
}

override def buildTestInput(file: Path, prefix: String): DefaultAnnotatedTestInput =
CounterexampleTestInput(file, prefix)
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ import viper.silver.verifier.{FailureContext, VerificationError}

import java.nio.file.Path

class CounterexampleTests extends SiliconTests {
override val testDirectories: Seq[String] = Seq("counterexamples")
class MappedCounterexampleTests extends SiliconTests {
override val testDirectories: Seq[String] = Seq("counterexample_mapped")

override def configureVerifiersFromConfigMap(configMap: Map[String, Any]): Unit = {
val args = Silicon.optionsFromScalaTestConfigMap(prefixSpecificConfigMap(configMap).getOrElse("silicon", Map()))
Expand Down Expand Up @@ -53,7 +53,7 @@ class CounterexampleTests extends SiliconTests {
override val outputIdPattern: String = "([^:]*)(:([^,]*))?"

private def isExpectedCounterexample(annotation: String, file: Path, lineNr: Int): Option[TestAnnotation] = {
def parseExpectedCounterexample(id: OutputAnnotationId, expectedCounterexampleString: String): Option[ExpectedCounterexampleAnnotation] = {
def parseExpectedCounterexample(id: OutputAnnotationId, expectedCounterexampleString: String): Option[ExpectedMappedCounterexampleAnnotation] = {
// in order to reuse as much of the existing Viper parser as possible, we have to initialize the `_file` and `_line_offset` fields:
val fp = new FastParser()
fp._file = file.toAbsolutePath
Expand All @@ -68,7 +68,7 @@ class CounterexampleTests extends SiliconTests {
val cParser = new CounterexampleParser(fp)
// now parsing is actually possible:
fastparse.parse(expectedCounterexampleString, cParser.expectedCounterexample(_)) match {
case Parsed.Success(expectedCounterexample, _) => Some(ExpectedCounterexampleAnnotation(id, file, lineNr, expectedCounterexample))
case Parsed.Success(expectedCounterexample, _) => Some(ExpectedMappedCounterexampleAnnotation(id, file, lineNr, expectedCounterexample))
case Parsed.Failure(_, _, extra) =>
println(s"Parsing expected counterexample failed in file $file: ${extra.trace().longAggregateMsg}")
None
Expand All @@ -88,7 +88,7 @@ class CounterexampleTests extends SiliconTests {
}

/** represents an expected output (identified by `id`) with an associated (possibly partial) counterexample model */
case class ExpectedCounterexampleAnnotation(id: OutputAnnotationId, file: Path, forLineNr: Int, expectedCounterexample: ExpectedCounterexample) extends CustomAnnotation {
case class ExpectedMappedCounterexampleAnnotation(id: OutputAnnotationId, file: Path, forLineNr: Int, expectedCounterexample: ExpectedCounterexample) extends CustomAnnotation {
override def matches(actual: AbstractOutput): Boolean =
id.matches(actual.fullId) && actual.isSameLine(file, forLineNr) && containsModel(actual)

Expand Down Expand Up @@ -164,5 +164,5 @@ case class ExpectedCounterexampleAnnotation(id: OutputAnnotationId, file: Path,

override def notFoundError: TestError = TestCustomError(s"Expected the following counterexample on line $forLineNr: $expectedCounterexample")

override def withForLineNr(line: Int = forLineNr): ExpectedCounterexampleAnnotation = ExpectedCounterexampleAnnotation(id, file, line, expectedCounterexample)
override def withForLineNr(line: Int = forLineNr): ExpectedMappedCounterexampleAnnotation = ExpectedMappedCounterexampleAnnotation(id, file, line, expectedCounterexample)
}
Loading