From 7d353945347d4f8d03fa54c36fe148704477556f Mon Sep 17 00:00:00 2001 From: Regis Blanc <regwblanc@gmail.com> Date: Wed, 6 May 2015 17:39:23 +0200 Subject: [PATCH] generate vc for division by zero --- src/main/scala/leon/verification/DefaultTactic.scala | 3 +++ src/main/scala/leon/verification/InjectAsserts.scala | 12 ++++++++++++ .../leon/verification/VerificationCondition.scala | 1 + .../verification/purescala/invalid/BVDivision.scala | 11 +++++++++++ .../verification/purescala/invalid/Division.scala | 11 +++++++++++ .../verification/purescala/valid/BVDivision.scala | 11 +++++++++++ .../verification/purescala/valid/Division.scala | 11 +++++++++++ 7 files changed, 60 insertions(+) create mode 100644 src/test/resources/regression/verification/purescala/invalid/BVDivision.scala create mode 100644 src/test/resources/regression/verification/purescala/invalid/Division.scala create mode 100644 src/test/resources/regression/verification/purescala/valid/BVDivision.scala create mode 100644 src/test/resources/regression/verification/purescala/valid/Division.scala diff --git a/src/main/scala/leon/verification/DefaultTactic.scala b/src/main/scala/leon/verification/DefaultTactic.scala index 70d8091b2..415f4edaa 100644 --- a/src/main/scala/leon/verification/DefaultTactic.scala +++ b/src/main/scala/leon/verification/DefaultTactic.scala @@ -49,6 +49,7 @@ class DefaultTactic(vctx: VerificationContext) extends Tactic(vctx) { case e @ Error(_, "Match is non-exhaustive") => (e, VCKinds.ExhaustiveMatch, BooleanLiteral(false)) + case e @ Error(_, _) => (e, VCKinds.Assert, BooleanLiteral(false)) @@ -57,6 +58,8 @@ class DefaultTactic(vctx: VerificationContext) extends Tactic(vctx) { VCKinds.MapUsage } else if (err.startsWith("Array ")) { VCKinds.ArrayUsage + } else if (err.startsWith("Division ")) { + VCKinds.DivisionByZero } else { VCKinds.Assert } diff --git a/src/main/scala/leon/verification/InjectAsserts.scala b/src/main/scala/leon/verification/InjectAsserts.scala index 8d0645e9b..3e371b3bc 100644 --- a/src/main/scala/leon/verification/InjectAsserts.scala +++ b/src/main/scala/leon/verification/InjectAsserts.scala @@ -30,6 +30,18 @@ object InjectAsserts extends LeonPhase[Program, Program] { Some(Assert(indexUpTo(i, ArrayLength(a)), Some("Array index out of range"), e).setPos(e)) case e @ MapGet(m,k) => Some(Assert(MapIsDefinedAt(m, k), Some("Map undefined at this index"), e).setPos(e)) + + case e @ Division(_, d) => + Some(Assert(Not(Equals(d, InfiniteIntegerLiteral(0))), + Some("Division by zero"), + e + ).setPos(e)) + case e @ BVDivision(_, d) => + Some(Assert(Not(Equals(d, IntLiteral(0))), + Some("Division by zero"), + e + ).setPos(e)) + case _ => None }) diff --git a/src/main/scala/leon/verification/VerificationCondition.scala b/src/main/scala/leon/verification/VerificationCondition.scala index 46e255d9c..890a16d06 100644 --- a/src/main/scala/leon/verification/VerificationCondition.scala +++ b/src/main/scala/leon/verification/VerificationCondition.scala @@ -34,6 +34,7 @@ object VCKinds { case object ExhaustiveMatch extends VCKind("match exhaustiveness", "match.") case object MapUsage extends VCKind("map usage", "map use") case object ArrayUsage extends VCKind("array usage", "arr. use") + case object DivisionByZero extends VCKind("division by zero", "div 0") } case class VCResult(status: VCStatus, solvedWith: Option[Solver], timeMs: Option[Long]) { diff --git a/src/test/resources/regression/verification/purescala/invalid/BVDivision.scala b/src/test/resources/regression/verification/purescala/invalid/BVDivision.scala new file mode 100644 index 000000000..a2572db84 --- /dev/null +++ b/src/test/resources/regression/verification/purescala/invalid/BVDivision.scala @@ -0,0 +1,11 @@ +import leon.lang._ +import leon.collection._ +import leon._ + +object BVDivision { + + def divByZero(x: Int): Boolean = { + (x / 0 == 10) + } + +} diff --git a/src/test/resources/regression/verification/purescala/invalid/Division.scala b/src/test/resources/regression/verification/purescala/invalid/Division.scala new file mode 100644 index 000000000..6b505a773 --- /dev/null +++ b/src/test/resources/regression/verification/purescala/invalid/Division.scala @@ -0,0 +1,11 @@ +import leon.lang._ +import leon.collection._ +import leon._ + +object Division { + + def divByZero(x: BigInt): Boolean = { + (x / BigInt(0) == BigInt(10)) + } + +} diff --git a/src/test/resources/regression/verification/purescala/valid/BVDivision.scala b/src/test/resources/regression/verification/purescala/valid/BVDivision.scala new file mode 100644 index 000000000..2121f416e --- /dev/null +++ b/src/test/resources/regression/verification/purescala/valid/BVDivision.scala @@ -0,0 +1,11 @@ +import leon.lang._ +import leon.collection._ +import leon._ + +object BVDivision { + + def noDivByZero(x: Int): Boolean = { + (x / 10 == 10) + } + +} diff --git a/src/test/resources/regression/verification/purescala/valid/Division.scala b/src/test/resources/regression/verification/purescala/valid/Division.scala new file mode 100644 index 000000000..49337b86d --- /dev/null +++ b/src/test/resources/regression/verification/purescala/valid/Division.scala @@ -0,0 +1,11 @@ +import leon.lang._ +import leon.collection._ +import leon._ + +object Division { + + def noDivByZero(x: BigInt): Boolean = { + (x / BigInt(10) == BigInt(10)) + } + +} -- GitLab