Skip to content

Commit 1ec6e56

Browse files
authored
Merge pull request #365 from ftsrg/chcfix
CHC to XCFA fixes
2 parents c821737 + b92c06a commit 1ec6e56

File tree

8 files changed

+60
-41
lines changed

8 files changed

+60
-41
lines changed

build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ buildscript {
2929

3030
allprojects {
3131
group = "hu.bme.mit.theta"
32-
version = "6.15.0"
32+
version = "6.15.1"
33+
3334

3435
apply(from = rootDir.resolve("gradle/shared-with-buildSrc/mirrors.gradle.kts"))
3536
}

subprojects/frontends/chc-frontend/src/main/java/hu/bme/mit/theta/frontend/chc/ChcForwardXcfaBuilder.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ private List<XcfaLabel> getIncomingAssignments(
130130
CHCParser.Chc_tailContext tail, Map<String, VarDecl<?>> localVars) {
131131
List<XcfaLabel> labels = new ArrayList<>();
132132
UPred from = locations.get(getTailFrom(tail).getName());
133+
if (tail.u_pred_atom().isEmpty()) {
134+
localVars.values().forEach(var -> labels.add(new StmtLabel(HavocStmt.of(var))));
135+
}
133136
tail.u_pred_atom()
134137
.forEach(
135138
u_pred -> {

subprojects/frontends/chc-frontend/src/main/java/hu/bme/mit/theta/frontend/chc/ChcUtils.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,7 @@
4545
import hu.bme.mit.theta.xcfa.model.StmtLabel;
4646
import hu.bme.mit.theta.xcfa.model.XcfaLabel;
4747
import hu.bme.mit.theta.xcfa.model.XcfaProcedureBuilder;
48-
import java.util.ArrayList;
49-
import java.util.Collections;
50-
import java.util.HashMap;
51-
import java.util.List;
52-
import java.util.Map;
48+
import java.util.*;
5349
import org.antlr.v4.runtime.CharStream;
5450
import org.antlr.v4.runtime.ParserRuleContext;
5551
import org.antlr.v4.runtime.misc.Interval;
@@ -101,17 +97,29 @@ public static String getOriginalText(ParserRuleContext ctx) {
10197
return charStream.getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
10298
}
10399

100+
private static final Map<Tuple2<String, Type>, VarDecl<?>> cache = new LinkedHashMap<>();
101+
102+
private static VarDecl<?> createVar(XcfaProcedureBuilder builder, String name, Type type) {
103+
var ret =
104+
cache.computeIfAbsent(
105+
Tuple2.of(name, type),
106+
objects -> {
107+
var v = Decls.Var(name, type);
108+
builder.addVar(v);
109+
return v;
110+
});
111+
transformConst(Decls.Const(name, type), false);
112+
return ret;
113+
}
114+
104115
public static Map<String, VarDecl<?>> createVars(
105116
XcfaProcedureBuilder builder, List<CHCParser.Var_declContext> var_decls) {
106117
resetSymbolTable();
107118
Map<String, VarDecl<?>> vars = new HashMap<>();
108119
for (CHCParser.Var_declContext var_decl : var_decls) {
109120
String name = var_decl.symbol().getText();
110-
String varName = name + "_" + builder.getEdges().size();
111121
Type type = transformSort(var_decl.sort());
112-
VarDecl<?> var = Decls.Var(varName, type);
113-
builder.addVar(var);
114-
transformConst(Decls.Const(name, type), false);
122+
VarDecl<?> var = createVar(builder, name, type);
115123
vars.put(name, var);
116124
}
117125
return vars;

subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaToMonolithicExpr.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ import hu.bme.mit.theta.core.type.fptype.FpType
3939
import hu.bme.mit.theta.core.type.inttype.IntExprs.Int
4040
import hu.bme.mit.theta.core.type.inttype.IntLitExpr
4141
import hu.bme.mit.theta.core.type.inttype.IntType
42+
import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat
43+
import hu.bme.mit.theta.core.type.rattype.RatType
4244
import hu.bme.mit.theta.core.utils.BvUtils
4345
import hu.bme.mit.theta.core.utils.FpUtils
4446
import hu.bme.mit.theta.core.utils.StmtUtils
@@ -119,6 +121,7 @@ fun XCFA.toMonolithicExpr(parseContext: ParseContext, initValues: Boolean = fals
119121
it.ref,
120122
BvUtils.bigIntegerToNeutralBvLitExpr(BigInteger.ZERO, (it.type as BvType).size),
121123
)
124+
is RatType -> Eq(it.ref, Rat(0, 1))
122125
is FpType ->
123126
FpAssign(
124127
it.ref as Expr<FpType>,

subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/checkers/ConfigToMddChecker.kt

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import hu.bme.mit.theta.xcfa.cli.params.*
3535
import hu.bme.mit.theta.xcfa.cli.utils.getSolver
3636
import hu.bme.mit.theta.xcfa.getFlatLabels
3737
import hu.bme.mit.theta.xcfa.model.XCFA
38+
import kotlin.jvm.optionals.getOrNull
3839

3940
fun getMddChecker(
4041
xcfa: XCFA,
@@ -70,11 +71,18 @@ fun getMddChecker(
7071
val solverPool = SolverPool(refinementSolverFactory)
7172
val iterationStrategy = mddConfig.iterationStrategy
7273

73-
return MddChecker.create<ExprAction>(
74-
monolithicExpr,
75-
variableOrder,
76-
solverPool,
77-
logger,
78-
iterationStrategy,
79-
)
74+
val checker =
75+
MddChecker.create<ExprAction>(
76+
monolithicExpr,
77+
variableOrder,
78+
solverPool,
79+
logger,
80+
iterationStrategy,
81+
)
82+
return SafetyChecker<MddProof, MddCex, UnitPrec> { input ->
83+
val result = checker.check(input)
84+
val stats = result.stats.getOrNull()
85+
stats?.keySet()?.forEach { key -> logger.writeln(Logger.Level.INFO, "$key: ${stats[key]}") }
86+
result
87+
}
8088
}

subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/portfolio/chccomp25.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ fun chcCompPortfolio25(
8787
ConfigNode(
8888
"Bounded-BMC-$inProcess",
8989
baseBoundedConfig.adaptConfig(
90+
inProcess = inProcess,
9091
bmcEnabled = true,
9192
indEnabled = false,
9293
itpEnabled = false,
@@ -99,6 +100,7 @@ fun chcCompPortfolio25(
99100
ConfigNode(
100101
"Bounded-KIND-$inProcess",
101102
baseBoundedConfig.adaptConfig(
103+
inProcess = inProcess,
102104
bmcEnabled = true,
103105
indEnabled = true,
104106
itpEnabled = false,
@@ -113,6 +115,7 @@ fun chcCompPortfolio25(
113115
ConfigNode(
114116
"Bounded-IMC-$inProcess",
115117
baseBoundedConfig.adaptConfig(
118+
inProcess = inProcess,
116119
bmcEnabled = false,
117120
indEnabled = false,
118121
itpEnabled = true,

subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaCliVerifyTest.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,7 @@ class XcfaCliVerifyTest {
155155
"/chc/chc-LIA-Lin_000.smt2",
156156
ChcFrontend.ChcTransformation.FORWARD,
157157
"--domain PRED_CART",
158-
),
159-
Arguments.of(
160-
"/chc/chc-LIA-Arrays_000.smt2",
161-
ChcFrontend.ChcTransformation.BACKWARD,
162-
"--domain PRED_CART --search BFS",
163-
),
158+
)
164159
)
165160
}
166161
}

subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/EliminateSelfLoops.kt

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,29 @@
1616
package hu.bme.mit.theta.xcfa.passes
1717

1818
import hu.bme.mit.theta.xcfa.model.*
19-
import java.util.stream.Collectors
2019

2120
class EliminateSelfLoops : ProcedurePass {
2221

2322
override fun run(builder: XcfaProcedureBuilder): XcfaProcedureBuilder {
24-
val selfLoops: Set<XcfaEdge> =
25-
builder
26-
.getEdges()
27-
.stream()
28-
.filter { xcfaEdge -> xcfaEdge.source === xcfaEdge.target }
29-
.collect(Collectors.toSet())
30-
for (selfLoop in selfLoops) {
31-
builder.removeEdge(selfLoop)
32-
val source = selfLoop.source
33-
val target =
34-
XcfaLocation(source.name + XcfaLocation.uniqueCounter(), metadata = source.metadata)
35-
builder.addLoc(target)
36-
for (outgoingEdge in LinkedHashSet(source.outgoingEdges)) {
37-
builder.removeEdge(outgoingEdge)
23+
while (true) {
24+
val selfLoop =
25+
builder.getEdges().firstOrNull { xcfaEdge -> xcfaEdge.source === xcfaEdge.target }
26+
if (selfLoop != null) {
27+
builder.removeEdge(selfLoop)
28+
val source = selfLoop.source
29+
val target =
30+
XcfaLocation(
31+
source.name + "_selfloop_" + XcfaLocation.uniqueCounter(),
32+
metadata = source.metadata,
33+
)
34+
builder.addLoc(target)
35+
builder.addEdge(XcfaEdge(source, target, selfLoop.label, selfLoop.metadata))
3836
builder.addEdge(
39-
XcfaEdge(target, outgoingEdge.target, outgoingEdge.label, outgoingEdge.metadata)
37+
XcfaEdge(target, source, SequenceLabel(listOf(NopLabel)), selfLoop.metadata)
4038
)
39+
} else {
40+
break
4141
}
42-
builder.addEdge(XcfaEdge(source, target, selfLoop.label, selfLoop.metadata))
43-
builder.addEdge(XcfaEdge(target, source, SequenceLabel(listOf(NopLabel)), selfLoop.metadata))
4442
}
4543
builder.metaData["noSelfLoops"] = Unit
4644
return builder

0 commit comments

Comments
 (0)