Skip to content

Commit

Permalink
Fixing unsoundness for functions
Browse files Browse the repository at this point in the history
  • Loading branch information
marcoeilers committed Feb 1, 2025
1 parent 4af34ab commit a82d466
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 10 deletions.
7 changes: 4 additions & 3 deletions src/main/scala/rules/MoreCompleteExhaleSupporter.scala
Original file line number Diff line number Diff line change
Expand Up @@ -444,8 +444,8 @@ object moreCompleteExhaleSupporter extends SymbolicExecutionRules {
val eqCmps = ch.args.zip(args).map { case (t1, t2) => t1 === t2 }
val eq = And(eqCmps)
val eqExp = permsExp.map(pe => BigAnd(removeKnownToBeTrueExp(ch.argsExp.get.zip(argsExp.get).map{ case (t1, t2) => ast.EqCmp(t1, t2)(pe.pos, pe.info, pe.errT) }.toList, eqCmps.toList)))
val permTaken = v.decider.fresh("p", sorts.Perm, Option.when(withExp)(PPrimitiv(PReserved(PKw.Perm)((ast.NoPosition, ast.NoPosition)))()))
val permTakenExp = permsExp.map(pe => ast.LocalVar(simplifyVariableName(permTaken.id.name), ast.Perm)(pe.pos, pe.info, pe.errT))
val permTaken = v.decider.appliedFresh("p", sorts.Perm, s.functionRecorderQuantifiedVariables().map(_._1))
val permTakenExp = permsExp.map(pe => ast.LocalVar(simplifyVariableName(permTaken.applicable.id.name), ast.Perm)(pe.pos, pe.info, pe.errT))

totalPermSum = PermPlus(totalPermSum, Ite(eq, ch.perm, NoPerm))
totalPermSumExp = totalPermSumExp.map(tps => ast.PermAdd(tps, ast.CondExp(eqExp.get, ch.permExp.get, ast.NoPerm()())(eqExp.get.pos, eqExp.get.info, eqExp.get.errT))(permsExp.get.pos, permsExp.get.info, permsExp.get.errT))
Expand All @@ -464,7 +464,8 @@ object moreCompleteExhaleSupporter extends SymbolicExecutionRules {


v.decider.assume(constraint, Option.when(withExp)(DebugExp.createInstance(constraintExp, constraintExp)))
newFr = newFr.recordConstrainedVar(permTaken, constraint)

newFr = newFr.recordPathSymbol(permTaken.applicable.asInstanceOf[Function]).recordConstraint(constraint)

ch.withPerm(PermMinus(ch.perm, permTaken), permsExp.map(pe => ast.PermSub(ch.permExp.get, permTakenExp.get)(pe.pos, pe.info, pe.errT)))
})
Expand Down
10 changes: 5 additions & 5 deletions src/main/scala/state/Terms.scala
Original file line number Diff line number Diff line change
Expand Up @@ -1263,13 +1263,13 @@ object FractionPerm extends CondFlyweightFactory[(Term, Term), Permissions, Frac
override def actualCreate(args: (Term, Term)): FractionPerm = new FractionPerm(args._1, args._2)
}

class IsValidPermVar private[terms] (val v: Var) extends BooleanTerm with ConditionalFlyweight[Var, IsValidPermVar] {
override val equalityDefiningMembers: Var = v
override lazy val toString = s"PVar($v)"
class IsValidPermVar private[terms] (val t: Term) extends BooleanTerm with ConditionalFlyweight[Term, IsValidPermVar] {
override val equalityDefiningMembers: Term = t
override lazy val toString = s"PVar($t)"
}

object IsValidPermVar extends CondFlyweightTermFactory[Var, IsValidPermVar] {
override def actualCreate(args: Var): IsValidPermVar = new IsValidPermVar((args))
object IsValidPermVar extends CondFlyweightTermFactory[Term, IsValidPermVar] {
override def actualCreate(args: Term): IsValidPermVar = new IsValidPermVar((args))
}

class IsReadPermVar private[terms] (val v: Var) extends BooleanTerm with ConditionalFlyweight[Var, IsReadPermVar] {
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/state/Utils.scala
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ package object utils {
case or: Or => or.ts
case _: PermLiteral => Nil
case fp: FractionPerm => List(fp.n, fp.d)
case ivp: IsValidPermVar => List(ivp.v)
case ivp: IsValidPermVar => List(ivp.t)
case irp: IsReadPermVar => List(irp.v)
case app: Application[_] => app.args
case sr: SeqRanged => List(sr.p0, sr.p1)
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/supporters/functions/FunctionRecorder.scala
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ case class ActualFunctionRecorder(private val _data: FunctionData,
else this

def recordPathSymbol(symbol: Function): ActualFunctionRecorder =
if (depth <= 1) copy(freshPathSymbols = freshPathSymbols + symbol)
if (depth <= 2) copy(freshPathSymbols = freshPathSymbols + symbol)
else this

def recordFreshMacro(decl: MacroDecl): FunctionRecorder =
Expand Down

0 comments on commit a82d466

Please sign in to comment.