diff --git a/lisa/lisa-analyses/src/test/java/it/unive/lisa/program/cfg/SemanticsSanityTest.java b/lisa/lisa-analyses/src/test/java/it/unive/lisa/program/cfg/SemanticsSanityTest.java
index 1eaf62093..321274937 100644
--- a/lisa/lisa-analyses/src/test/java/it/unive/lisa/program/cfg/SemanticsSanityTest.java
+++ b/lisa/lisa-analyses/src/test/java/it/unive/lisa/program/cfg/SemanticsSanityTest.java
@@ -188,6 +188,12 @@ public String toString() {
return "fake";
}
+ @Override
+ protected int compareSameClass(
+ Statement o) {
+ return 0;
+ }
+
@Override
public > AnalysisState forwardSemantics(
AnalysisState entryState,
diff --git a/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/constructs/ArrayLength.java b/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/constructs/ArrayLength.java
index b275ee346..97f91d1d7 100644
--- a/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/constructs/ArrayLength.java
+++ b/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/constructs/ArrayLength.java
@@ -119,6 +119,12 @@ public IMPArrayLength(
super(cfg, location, "arraylen", parameter);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdUnarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPAddOrConcat.java b/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPAddOrConcat.java
index 43174b019..5e24d74da 100644
--- a/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPAddOrConcat.java
+++ b/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPAddOrConcat.java
@@ -9,6 +9,7 @@
import it.unive.lisa.program.SourceCodeLocation;
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.program.type.StringType;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.value.BinaryExpression;
@@ -56,6 +57,12 @@ public IMPAddOrConcat(
super(cfg, new SourceCodeLocation(sourceFile, line, col), "+", left, right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPArrayAccess.java b/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPArrayAccess.java
index 7e479c894..2a742753f 100644
--- a/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPArrayAccess.java
+++ b/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPArrayAccess.java
@@ -9,6 +9,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.statement.BinaryExpression;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.heap.AccessChild;
import it.unive.lisa.symbolic.heap.HeapDereference;
@@ -47,6 +48,12 @@ public IMPArrayAccess(
super(cfg, new SourceCodeLocation(sourceFile, line, col), "[]", container, location);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPAssert.java b/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPAssert.java
index 9f678acb6..6afad0c9c 100644
--- a/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPAssert.java
+++ b/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPAssert.java
@@ -8,6 +8,7 @@
import it.unive.lisa.program.SourceCodeLocation;
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.program.cfg.statement.UnaryStatement;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.value.Skip;
@@ -39,6 +40,12 @@ public IMPAssert(
super(cfg, new SourceCodeLocation(sourceFile, line, col), "assert", expression);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdUnarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPNewArray.java b/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPNewArray.java
index 6bfcffe21..2c4926fd1 100644
--- a/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPNewArray.java
+++ b/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPNewArray.java
@@ -11,6 +11,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.statement.Expression;
import it.unive.lisa.program.cfg.statement.NaryExpression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.program.type.Int32Type;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.heap.AccessChild;
@@ -62,6 +63,12 @@ public IMPNewArray(
this.staticallyAllocated = staticallyAllocated;
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return Boolean.compare(staticallyAllocated, ((IMPNewArray) o).staticallyAllocated);
+ }
+
@Override
public > AnalysisState forwardSemanticsAux(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPNewObj.java b/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPNewObj.java
index 2b2a5d43d..611b046dd 100644
--- a/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPNewObj.java
+++ b/lisa/lisa-imp/src/main/java/it/unive/lisa/imp/expressions/IMPNewObj.java
@@ -10,6 +10,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.statement.Expression;
import it.unive.lisa.program.cfg.statement.NaryExpression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.program.cfg.statement.VariableRef;
import it.unive.lisa.program.cfg.statement.call.Call.CallType;
import it.unive.lisa.program.cfg.statement.call.UnresolvedCall;
@@ -64,6 +65,12 @@ public IMPNewObj(
this.staticallyAllocated = staticallyAllocated;
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return Boolean.compare(staticallyAllocated, ((IMPNewObj) o).staticallyAllocated);
+ }
+
@Override
public > AnalysisState forwardSemanticsAux(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/Equal.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/Equal.java
index 24ff85f77..1865349a8 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/Equal.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/Equal.java
@@ -8,6 +8,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.value.BinaryExpression;
import it.unive.lisa.symbolic.value.operator.binary.ComparisonEq;
@@ -37,6 +38,12 @@ public Equal(
super(cfg, location, "==", cfg.getDescriptor().getUnit().getProgram().getTypes().getBooleanType(), left, right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/GreaterOrEqual.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/GreaterOrEqual.java
index d743c281e..c266dda2f 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/GreaterOrEqual.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/GreaterOrEqual.java
@@ -8,6 +8,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.value.BinaryExpression;
import it.unive.lisa.symbolic.value.operator.binary.ComparisonGe;
@@ -40,6 +41,12 @@ public GreaterOrEqual(
super(cfg, location, ">=", cfg.getDescriptor().getUnit().getProgram().getTypes().getBooleanType(), left, right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/GreaterThan.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/GreaterThan.java
index 41859ce64..16dee3872 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/GreaterThan.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/GreaterThan.java
@@ -8,6 +8,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.value.BinaryExpression;
import it.unive.lisa.symbolic.value.operator.binary.ComparisonGt;
@@ -40,6 +41,12 @@ public GreaterThan(
super(cfg, location, ">", cfg.getDescriptor().getUnit().getProgram().getTypes().getBooleanType(), left, right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/LessOrEqual.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/LessOrEqual.java
index 3293bfcc1..f06a5a69e 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/LessOrEqual.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/LessOrEqual.java
@@ -8,6 +8,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.value.BinaryExpression;
import it.unive.lisa.symbolic.value.operator.binary.ComparisonLe;
@@ -40,6 +41,12 @@ public LessOrEqual(
super(cfg, location, "<=", cfg.getDescriptor().getUnit().getProgram().getTypes().getBooleanType(), left, right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/LessThan.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/LessThan.java
index 790b7e733..ef70207ba 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/LessThan.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/LessThan.java
@@ -8,6 +8,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.value.BinaryExpression;
import it.unive.lisa.symbolic.value.operator.binary.ComparisonLt;
@@ -40,6 +41,12 @@ public LessThan(
super(cfg, location, "<", cfg.getDescriptor().getUnit().getProgram().getTypes().getBooleanType(), left, right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/NotEqual.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/NotEqual.java
index 54d8cbc4a..14d378474 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/NotEqual.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/comparison/NotEqual.java
@@ -8,6 +8,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.value.BinaryExpression;
import it.unive.lisa.symbolic.value.operator.binary.ComparisonNe;
@@ -37,6 +38,12 @@ public NotEqual(
super(cfg, location, "!=", cfg.getDescriptor().getUnit().getProgram().getTypes().getBooleanType(), left, right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/global/AccessGlobal.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/global/AccessGlobal.java
index 238dc6f34..2559d2400 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/global/AccessGlobal.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/global/AccessGlobal.java
@@ -111,6 +111,16 @@ public boolean equals(
return true;
}
+ @Override
+ protected int compareSameClass(
+ Statement o) {
+ AccessGlobal other = (AccessGlobal) o;
+ int cmp;
+ if ((cmp = container.getName().compareTo(other.container.getName())) != 0)
+ return cmp;
+ return target.getName().compareTo(other.target.getName());
+ }
+
@Override
public String toString() {
return container.getName() + "::" + target.getName();
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/global/AccessInstanceGlobal.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/global/AccessInstanceGlobal.java
index 501f65a3c..a777c83e5 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/global/AccessInstanceGlobal.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/global/AccessInstanceGlobal.java
@@ -12,6 +12,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.program.cfg.statement.UnaryExpression;
import it.unive.lisa.program.language.hierarchytraversal.HierarcyTraversalStrategy;
import it.unive.lisa.symbolic.SymbolicExpression;
@@ -100,6 +101,13 @@ public boolean equals(
return true;
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ AccessInstanceGlobal other = (AccessInstanceGlobal) o;
+ return target.compareTo(other.target);
+ }
+
@Override
public String toString() {
return getSubExpression() + "::" + target;
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/logic/And.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/logic/And.java
index 106553834..cbcfb3307 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/logic/And.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/logic/And.java
@@ -8,6 +8,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.value.BinaryExpression;
import it.unive.lisa.symbolic.value.operator.binary.LogicalAnd;
@@ -39,6 +40,12 @@ public And(
super(cfg, location, "&&", cfg.getDescriptor().getUnit().getProgram().getTypes().getBooleanType(), left, right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/logic/Not.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/logic/Not.java
index e07a5ade3..0dbca2260 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/logic/Not.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/logic/Not.java
@@ -8,6 +8,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.value.UnaryExpression;
import it.unive.lisa.symbolic.value.operator.unary.LogicalNegation;
@@ -37,6 +38,12 @@ public Not(
super(cfg, location, "!", cfg.getDescriptor().getUnit().getProgram().getTypes().getBooleanType(), expression);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdUnarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/logic/Or.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/logic/Or.java
index 9cb40848f..7c6501d81 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/logic/Or.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/logic/Or.java
@@ -8,6 +8,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.value.BinaryExpression;
import it.unive.lisa.symbolic.value.operator.binary.LogicalOr;
@@ -39,6 +40,12 @@ public Or(
super(cfg, location, "||", cfg.getDescriptor().getUnit().getProgram().getTypes().getBooleanType(), left, right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Addition.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Addition.java
index 64de9f4da..0d4b9197d 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Addition.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Addition.java
@@ -8,6 +8,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.value.BinaryExpression;
import it.unive.lisa.symbolic.value.operator.binary.NumericNonOverflowingAdd;
@@ -40,6 +41,12 @@ public Addition(
super(cfg, location, "+", left, right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Division.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Division.java
index 4d130ef61..d4ce61113 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Division.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Division.java
@@ -8,6 +8,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.value.BinaryExpression;
import it.unive.lisa.symbolic.value.operator.binary.NumericNonOverflowingDiv;
@@ -40,6 +41,12 @@ public Division(
super(cfg, location, "/", left, right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Modulo.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Modulo.java
index 51dd4fa30..75006f4bc 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Modulo.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Modulo.java
@@ -8,6 +8,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.value.BinaryExpression;
import it.unive.lisa.symbolic.value.operator.binary.NumericNonOverflowingMod;
@@ -41,6 +42,12 @@ public Modulo(
super(cfg, location, "%", left, right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Multiplication.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Multiplication.java
index 7e27d89ac..3842afb9a 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Multiplication.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Multiplication.java
@@ -8,6 +8,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.value.BinaryExpression;
import it.unive.lisa.symbolic.value.operator.binary.NumericNonOverflowingMul;
@@ -40,6 +41,12 @@ public Multiplication(
super(cfg, location, "*", left, right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Negation.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Negation.java
index aa8a7e6aa..66ecaadac 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Negation.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Negation.java
@@ -8,6 +8,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.value.UnaryExpression;
import it.unive.lisa.symbolic.value.operator.unary.NumericNegation;
@@ -37,6 +38,12 @@ public Negation(
super(cfg, location, "-", expression);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdUnarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Remainder.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Remainder.java
index 39c760f36..5f8a4fbef 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Remainder.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Remainder.java
@@ -8,6 +8,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.value.BinaryExpression;
import it.unive.lisa.symbolic.value.operator.binary.NumericNonOverflowingRem;
@@ -41,6 +42,12 @@ public Remainder(
super(cfg, location, "%", left, right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Subtraction.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Subtraction.java
index 6dafa73dc..d3e55ecbb 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Subtraction.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/numeric/Subtraction.java
@@ -8,6 +8,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.symbolic.value.BinaryExpression;
import it.unive.lisa.symbolic.value.operator.binary.NumericNonOverflowingSub;
@@ -40,6 +41,12 @@ public Subtraction(
super(cfg, location, "-", left, right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Concat.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Concat.java
index 01a956573..c3f1feac1 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Concat.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Concat.java
@@ -61,6 +61,12 @@ public Concat(
right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Contains.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Contains.java
index 694b5b497..2dfbce8b7 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Contains.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Contains.java
@@ -62,6 +62,12 @@ public Contains(
right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/EndsWith.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/EndsWith.java
index 1b0dbbcb4..a89dfd03d 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/EndsWith.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/EndsWith.java
@@ -62,6 +62,12 @@ public EndsWith(
right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Equals.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Equals.java
index d4d7c4f4d..d44c8243e 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Equals.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Equals.java
@@ -62,6 +62,12 @@ public Equals(
right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/IndexOf.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/IndexOf.java
index 9a6535e1e..3210f0df3 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/IndexOf.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/IndexOf.java
@@ -62,6 +62,12 @@ public IndexOf(
right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Length.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Length.java
index 03d3f3eec..c7c95e695 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Length.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Length.java
@@ -59,6 +59,12 @@ public Length(
super(cfg, location, "len", cfg.getDescriptor().getUnit().getProgram().getTypes().getIntegerType(), parameter);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdUnarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Replace.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Replace.java
index 0da38736c..21e270e77 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Replace.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Replace.java
@@ -63,6 +63,12 @@ public Replace(
middle, right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdTernarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/StartsWith.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/StartsWith.java
index 2f8e100cb..130e82519 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/StartsWith.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/StartsWith.java
@@ -62,6 +62,12 @@ public StartsWith(
right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdBinarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Substring.java b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Substring.java
index 11ae02ee8..369e29e0a 100644
--- a/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Substring.java
+++ b/lisa/lisa-program/src/main/java/it/unive/lisa/program/cfg/statement/string/Substring.java
@@ -65,6 +65,12 @@ public Substring(
middle, right);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState fwdTernarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Assignment.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Assignment.java
index bfc09fa62..0b8141a58 100644
--- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Assignment.java
+++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Assignment.java
@@ -105,6 +105,12 @@ public Assignment(
super(cfg, location, "=", order, staticType, target, expression);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public final String toString() {
return getLeft() + " = " + getRight();
diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/DefaultParamInitialization.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/DefaultParamInitialization.java
index 67b9d2b5d..b3ed332f5 100644
--- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/DefaultParamInitialization.java
+++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/DefaultParamInitialization.java
@@ -41,6 +41,12 @@ public DefaultParamInitialization(
super(cfg, location, type);
}
+ @Override
+ protected int compareSameClass(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public boolean accept(
GraphVisitor visitor,
diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/NaryExpression.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/NaryExpression.java
index 3c010d3f5..dce2441ea 100644
--- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/NaryExpression.java
+++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/NaryExpression.java
@@ -251,6 +251,33 @@ public boolean equals(
return true;
}
+ @Override
+ protected int compareSameClass(
+ Statement o) {
+ NaryExpression other = (NaryExpression) o;
+ int cmp;
+ if ((cmp = Integer.compare(subExpressions.length, other.subExpressions.length)) != 0)
+ return cmp;
+ for (int i = 0; i < subExpressions.length; i++)
+ if ((cmp = subExpressions[i].compareTo(other.subExpressions[i])) != 0)
+ return cmp;
+ return compareSameClassAndParams(o);
+ }
+
+ /**
+ * Auxiliary method for {@link #compareTo(Statement)} that can safely assume
+ * that the two expressions happen at the same {@link CodeLocation}, are
+ * instances of the same class, and have the same parameters according to
+ * their implementation of {@link #compareTo(Statement)}.
+ *
+ * @param o the other expression
+ *
+ * @return a negative integer, zero, or a positive integer as this object is
+ * less than, equal to, or greater than the specified object
+ */
+ protected abstract int compareSameClassAndParams(
+ Statement o);
+
/**
* Semantics of an n-ary expression is evaluated by computing the semantics
* of its sub-expressions, in the specified order, using the analysis state
diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/NaryStatement.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/NaryStatement.java
index f0e94fb22..ef0adb128 100644
--- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/NaryStatement.java
+++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/NaryStatement.java
@@ -202,6 +202,33 @@ public boolean equals(
return true;
}
+ @Override
+ protected int compareSameClass(
+ Statement o) {
+ NaryStatement other = (NaryStatement) o;
+ int cmp;
+ if ((cmp = Integer.compare(subExpressions.length, other.subExpressions.length)) != 0)
+ return cmp;
+ for (int i = 0; i < subExpressions.length; i++)
+ if ((cmp = subExpressions[i].compareTo(other.subExpressions[i])) != 0)
+ return cmp;
+ return compareSameClassAndParams(o);
+ }
+
+ /**
+ * Auxiliary method for {@link #compareTo(Statement)} that can safely assume
+ * that the two statements happen at the same {@link CodeLocation}, are
+ * instances of the same class, and have the same parameters according to
+ * their implementation of {@link #compareTo(Statement)}.
+ *
+ * @param o the other statement
+ *
+ * @return a negative integer, zero, or a positive integer as this object is
+ * less than, equal to, or greater than the specified object
+ */
+ protected abstract int compareSameClassAndParams(
+ Statement o);
+
/**
* Semantics of an n-ary statements is evaluated by computing the semantics
* of its sub-expressions, in the specified order, using the analysis state
diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/NoOp.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/NoOp.java
index 07ceeb3eb..0090ce380 100644
--- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/NoOp.java
+++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/NoOp.java
@@ -49,6 +49,12 @@ public boolean equals(
return true;
}
+ @Override
+ protected int compareSameClass(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public final String toString() {
return "no-op";
diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Ret.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Ret.java
index 9d0ac2646..46544aa42 100644
--- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Ret.java
+++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Ret.java
@@ -55,6 +55,12 @@ public boolean equals(
return true;
}
+ @Override
+ protected int compareSameClass(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public final String toString() {
return "ret";
diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Return.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Return.java
index 8b9968880..f2b302a5e 100644
--- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Return.java
+++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Return.java
@@ -36,6 +36,12 @@ public Return(
super(cfg, location, "return", expression);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public boolean stopsExecution() {
return true;
diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Statement.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Statement.java
index 6c09865ed..ac07f0943 100644
--- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Statement.java
+++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Statement.java
@@ -170,11 +170,29 @@ public CodeLocation getLocation() {
}
@Override
- public int compareTo(
+ public final int compareTo(
Statement o) {
- return location.compareTo(o.location);
+ int cmp;
+ if ((cmp = location.compareTo(o.location)) != 0)
+ return cmp;
+ if ((cmp = getClass().getName().compareTo(o.getClass().getName())) != 0)
+ return cmp;
+ return compareSameClass(o);
}
+ /**
+ * Auxiliary method for {@link #compareTo(Statement)} that can safely assume
+ * that the two statements happen at the same {@link CodeLocation} and are
+ * instances of the same class.
+ *
+ * @param o the other statement
+ *
+ * @return a negative integer, zero, or a positive integer as this object is
+ * less than, equal to, or greater than the specified object
+ */
+ protected abstract int compareSameClass(
+ Statement o);
+
/**
* Yields the {@link Statement} that is evaluated right before this one,
* such that querying for the entry state of {@code this} statement is
diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Throw.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Throw.java
index 86922ad5f..84e9c9e93 100644
--- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Throw.java
+++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/Throw.java
@@ -34,6 +34,12 @@ public Throw(
super(cfg, location, "throw", expression);
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public boolean stopsExecution() {
return true;
diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/VariableRef.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/VariableRef.java
index 05269578d..452719bd0 100644
--- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/VariableRef.java
+++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/VariableRef.java
@@ -45,6 +45,12 @@ public VariableRef(
this(cfg, location, name, Untyped.INSTANCE);
}
+ @Override
+ protected int compareSameClass(
+ Statement o) {
+ return 0; // no extra fields to compare
+ }
+
/**
* Builds the variable reference, identified by its name, happening at the
* given location in the program.
diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/CFGCall.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/CFGCall.java
index 6c6e223de..32ee4f403 100644
--- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/CFGCall.java
+++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/CFGCall.java
@@ -174,6 +174,12 @@ public boolean equals(
return true;
}
+ @Override
+ protected int compareCallAux(
+ Call o) {
+ return 0; // we do not compare the targets
+ }
+
@Override
public String toString() {
return "[" + targets.size() + " targets] " + super.toString();
diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/Call.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/Call.java
index 9d5d75ed7..601c4d42a 100644
--- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/Call.java
+++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/Call.java
@@ -9,9 +9,11 @@
import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.statement.Expression;
import it.unive.lisa.program.cfg.statement.NaryExpression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.program.cfg.statement.evaluation.EvaluationOrder;
import it.unive.lisa.symbolic.SymbolicExpression;
import it.unive.lisa.type.Type;
+import it.unive.lisa.util.collections.CollectionUtilities;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
@@ -242,6 +244,37 @@ public boolean equals(
return true;
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ Call other = (Call) o;
+ int cmp;
+ if ((cmp = targetName.compareTo(other.targetName)) != 0)
+ return cmp;
+ if ((cmp = CollectionUtilities.nullSafeCompare(true, qualifier, other.qualifier, String::compareTo)) != 0)
+ return cmp;
+ if ((cmp = callType.compareTo(other.callType)) != 0)
+ return cmp;
+ return compareCallAux(other);
+ }
+
+ /**
+ * Auxiliary method for {@link #compareTo(Statement)} that can safely assume
+ * that the two calls happen at the same {@link CodeLocation}, are instances
+ * of the same class, have the same parameters according to their
+ * implementation of {@link #compareTo(Statement)}, and have all fields
+ * defined in the {@link Call} class equal according to their
+ * {@link Comparable#compareTo(Object)}. This method is thus responsible for
+ * only comparing the implementation-specific fields.
+ *
+ * @param o the other call
+ *
+ * @return a negative integer, zero, or a positive integer as this object is
+ * less than, equal to, or greater than the specified object
+ */
+ protected abstract int compareCallAux(
+ Call o);
+
/**
* Yields an array containing the runtime types of the parameters of this
* call, retrieved by accessing the given {@link StatementStore}.
diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/MultiCall.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/MultiCall.java
index f10857cc0..c6ee0b62a 100644
--- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/MultiCall.java
+++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/MultiCall.java
@@ -6,16 +6,11 @@
import it.unive.lisa.analysis.StatementStore;
import it.unive.lisa.analysis.lattices.ExpressionSet;
import it.unive.lisa.interprocedural.InterproceduralAnalysis;
-import it.unive.lisa.program.cfg.CFG;
-import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.CodeMember;
-import it.unive.lisa.program.cfg.statement.Expression;
-import it.unive.lisa.program.cfg.statement.evaluation.EvaluationOrder;
-import it.unive.lisa.program.cfg.statement.evaluation.LeftToRightEvaluation;
import it.unive.lisa.type.Type;
import it.unive.lisa.type.Untyped;
import java.util.Collection;
-import java.util.Iterator;
+import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@@ -34,75 +29,37 @@ public class MultiCall extends Call implements ResolvedCall {
private final Collection calls;
/**
- * Builds the multi-call, happening at the given location in the program.
- * The {@link EvaluationOrder} of the parameter is
- * {@link LeftToRightEvaluation}. The static type of this call is the common
- * supertype of the return types of all targets.
- *
- * @param cfg the cfg that this expression belongs to
- * @param location the location where this expression is defined within
- * the program
- * @param callType the call type of this call
- * @param qualifier the optional qualifier of the call (can be null or
- * empty - see {@link #getFullTargetName()} for more
- * info)
- * @param targetName the qualified name of the static target of this call
- * @param calls the Calls underlying this one
- * @param parameters the parameters of this call
- */
- public MultiCall(
- CFG cfg,
- CodeLocation location,
- CallType callType,
- String qualifier,
- String targetName,
- Collection calls,
- Expression... parameters) {
- this(cfg, location, callType, qualifier, targetName, LeftToRightEvaluation.INSTANCE, calls, parameters);
- }
-
- /**
- * Builds the multi call, happening at the given location in the program.
- * The static type of this call is the common supertype of the return types
- * of all targets.
+ * Creates a multi call as the resolved version of the given {@code source}
+ * call, copying all its data.
*
- * @param cfg the cfg that this expression belongs to
- * @param location the location where this expression is defined within
- * the program
- * @param callType the call type of this call
- * @param qualifier the optional qualifier of the call (can be null or
- * empty - see {@link #getFullTargetName()} for more
- * info)
- * @param targetName the qualified name of the static target of this call
- * @param order the evaluation order of the sub-expressions
- * @param calls the Calls underlying this one
- * @param parameters the parameters of this call
+ * @param source the unresolved call to copy
+ * @param calls the calls underlying this one
*/
public MultiCall(
- CFG cfg,
- CodeLocation location,
- CallType callType,
- String qualifier,
- String targetName,
- EvaluationOrder order,
- Collection calls,
- Expression... parameters) {
- super(cfg, location, callType, qualifier, targetName, order, getCommonReturnType(calls), parameters);
+ UnresolvedCall source,
+ Call... calls) {
+ super(source.getCFG(),
+ source.getLocation(),
+ source.getCallType(),
+ source.getQualifier(),
+ source.getTargetName(),
+ source.getOrder(),
+ getCommonReturnType(calls),
+ source.getParameters());
Objects.requireNonNull(calls, "The calls underlying a multi call cannot be null");
for (Call target : calls) {
Objects.requireNonNull(target, "A call underlying a multi call cannot be null");
if (!(target instanceof ResolvedCall))
throw new IllegalArgumentException(target + " has not been resolved yet");
}
- this.calls = calls;
+ this.calls = List.of(calls);
}
private static Type getCommonReturnType(
- Collection targets) {
- Iterator it = targets.iterator();
+ Call... targets) {
Type result = null;
- while (it.hasNext()) {
- Type current = it.next().getStaticType();
+ for (Call c : targets) {
+ Type current = c.getStaticType();
if (result == null)
result = current;
else if (current.canBeAssignedTo(result))
@@ -119,23 +76,6 @@ else if (result.canBeAssignedTo(current))
return result == null ? Untyped.INSTANCE : result;
}
- /**
- * Creates a multi call as the resolved version of the given {@code source}
- * call, copying all its data.
- *
- * @param source the unresolved call to copy
- * @param calls the calls underlying this one
- */
- public MultiCall(
- UnresolvedCall source,
- Call... calls) {
- this(source.getCFG(), source.getLocation(), source.getCallType(), source.getQualifier(), source.getTargetName(),
- List.of(calls), source.getParameters());
- for (Expression param : source.getParameters())
- // make sure they stay linked to the original call
- param.setParentStatement(source);
- }
-
/**
* Yields the calls underlying this multi call.
*
@@ -171,6 +111,21 @@ public boolean equals(
return true;
}
+ @Override
+ protected int compareCallAux(
+ Call o) {
+ MultiCall other = (MultiCall) o;
+ int cmp;
+ if ((cmp = Integer.compare(calls.size(), other.calls.size())) != 0)
+ return cmp;
+ List l1 = new LinkedList<>(calls);
+ List l2 = new LinkedList<>(other.calls);
+ for (int i = 0; i < l1.size(); i++)
+ if ((cmp = l1.get(i).compareTo(l2.get(i))) != 0)
+ return cmp;
+ return 0;
+ }
+
@Override
public String toString() {
return "[multi] " + super.toString();
diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/NamedParameterExpression.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/NamedParameterExpression.java
index 878fb0269..3ad30af21 100644
--- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/NamedParameterExpression.java
+++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/NamedParameterExpression.java
@@ -8,6 +8,7 @@
import it.unive.lisa.program.cfg.CFG;
import it.unive.lisa.program.cfg.CodeLocation;
import it.unive.lisa.program.cfg.statement.Expression;
+import it.unive.lisa.program.cfg.statement.Statement;
import it.unive.lisa.program.cfg.statement.UnaryExpression;
import it.unive.lisa.program.language.parameterassignment.ParameterAssigningStrategy;
import it.unive.lisa.symbolic.SymbolicExpression;
@@ -81,6 +82,12 @@ public boolean equals(
return true;
}
+ @Override
+ protected int compareSameClassAndParams(
+ Statement o) {
+ return parameterName.compareTo(((NamedParameterExpression) o).parameterName);
+ }
+
@Override
public > AnalysisState fwdUnarySemantics(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/NativeCall.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/NativeCall.java
index 4fd4924d7..24922e515 100644
--- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/NativeCall.java
+++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/NativeCall.java
@@ -178,6 +178,12 @@ public boolean equals(
return true;
}
+ @Override
+ protected int compareCallAux(
+ Call o) {
+ return 0; // we do not compare the targets
+ }
+
@Override
public String toString() {
return "[" + targets.size() + " targets] " + super.toString();
diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/OpenCall.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/OpenCall.java
index 7877432a2..f36f8a5cd 100644
--- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/OpenCall.java
+++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/OpenCall.java
@@ -147,6 +147,12 @@ public OpenCall(
param.setParentStatement(source);
}
+ @Override
+ protected int compareCallAux(
+ Call o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public String toString() {
return "[open] " + super.toString();
diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/TruncatedParamsCall.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/TruncatedParamsCall.java
index 2cf04ee30..8091494ec 100644
--- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/TruncatedParamsCall.java
+++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/TruncatedParamsCall.java
@@ -69,6 +69,12 @@ public boolean equals(
return true;
}
+ @Override
+ protected int compareCallAux(
+ Call o) {
+ return call.compareCallAux(((TruncatedParamsCall) o).call);
+ }
+
@Override
public > AnalysisState forwardSemanticsAux(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/UnresolvedCall.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/UnresolvedCall.java
index 7fdccdd11..b971e4ac0 100644
--- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/UnresolvedCall.java
+++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/call/UnresolvedCall.java
@@ -134,6 +134,12 @@ public UnresolvedCall(
super(cfg, location, callType, qualifier, targetName, order, staticType, parameters);
}
+ @Override
+ protected int compareCallAux(
+ Call o) {
+ return 0; // no extra fields to compare
+ }
+
@Override
public > AnalysisState forwardSemanticsAux(
InterproceduralAnalysis interprocedural,
diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/literal/Literal.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/literal/Literal.java
index c33abb17f..610472eec 100644
--- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/literal/Literal.java
+++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/program/cfg/statement/literal/Literal.java
@@ -82,6 +82,14 @@ public boolean equals(
return true;
}
+ @Override
+ protected int compareSameClass(
+ Statement o) {
+ // no other way of comparing without imposing that the
+ // constants must be comparable
+ return toString().compareTo(o.toString());
+ }
+
@Override
public String toString() {
return String.valueOf(value);