From 8a7caa90b45fe7e2015b892277c691db4d3f2598 Mon Sep 17 00:00:00 2001 From: Luca Negrini Date: Thu, 7 Dec 2023 11:26:11 +0100 Subject: [PATCH] Restoring compareTo()'s #298 --- .../lisa/program/cfg/SemanticsSanityTest.java | 6 + .../lisa/imp/constructs/ArrayLength.java | 6 + .../lisa/imp/expressions/IMPAddOrConcat.java | 7 ++ .../lisa/imp/expressions/IMPArrayAccess.java | 7 ++ .../unive/lisa/imp/expressions/IMPAssert.java | 7 ++ .../lisa/imp/expressions/IMPNewArray.java | 7 ++ .../unive/lisa/imp/expressions/IMPNewObj.java | 7 ++ .../cfg/statement/comparison/Equal.java | 7 ++ .../statement/comparison/GreaterOrEqual.java | 7 ++ .../cfg/statement/comparison/GreaterThan.java | 7 ++ .../cfg/statement/comparison/LessOrEqual.java | 7 ++ .../cfg/statement/comparison/LessThan.java | 7 ++ .../cfg/statement/comparison/NotEqual.java | 7 ++ .../cfg/statement/global/AccessGlobal.java | 10 ++ .../global/AccessInstanceGlobal.java | 8 ++ .../lisa/program/cfg/statement/logic/And.java | 7 ++ .../lisa/program/cfg/statement/logic/Not.java | 7 ++ .../lisa/program/cfg/statement/logic/Or.java | 7 ++ .../cfg/statement/numeric/Addition.java | 7 ++ .../cfg/statement/numeric/Division.java | 7 ++ .../program/cfg/statement/numeric/Modulo.java | 7 ++ .../cfg/statement/numeric/Multiplication.java | 7 ++ .../cfg/statement/numeric/Negation.java | 7 ++ .../cfg/statement/numeric/Remainder.java | 7 ++ .../cfg/statement/numeric/Subtraction.java | 7 ++ .../program/cfg/statement/string/Concat.java | 6 + .../cfg/statement/string/Contains.java | 6 + .../cfg/statement/string/EndsWith.java | 6 + .../program/cfg/statement/string/Equals.java | 6 + .../program/cfg/statement/string/IndexOf.java | 6 + .../program/cfg/statement/string/Length.java | 6 + .../program/cfg/statement/string/Replace.java | 6 + .../cfg/statement/string/StartsWith.java | 6 + .../cfg/statement/string/Substring.java | 6 + .../program/cfg/statement/Assignment.java | 6 + .../statement/DefaultParamInitialization.java | 6 + .../program/cfg/statement/NaryExpression.java | 27 +++++ .../program/cfg/statement/NaryStatement.java | 27 +++++ .../lisa/program/cfg/statement/NoOp.java | 6 + .../unive/lisa/program/cfg/statement/Ret.java | 6 + .../lisa/program/cfg/statement/Return.java | 6 + .../lisa/program/cfg/statement/Statement.java | 22 +++- .../lisa/program/cfg/statement/Throw.java | 6 + .../program/cfg/statement/VariableRef.java | 6 + .../program/cfg/statement/call/CFGCall.java | 6 + .../lisa/program/cfg/statement/call/Call.java | 33 +++++ .../program/cfg/statement/call/MultiCall.java | 113 ++++++------------ .../call/NamedParameterExpression.java | 7 ++ .../cfg/statement/call/NativeCall.java | 6 + .../program/cfg/statement/call/OpenCall.java | 6 + .../statement/call/TruncatedParamsCall.java | 6 + .../cfg/statement/call/UnresolvedCall.java | 6 + .../cfg/statement/literal/Literal.java | 8 ++ 53 files changed, 459 insertions(+), 81 deletions(-) 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);