From 6586dd7a80c5600bf53bcdbf2208a01335f6705f Mon Sep 17 00:00:00 2001 From: Luca Negrini Date: Mon, 4 Dec 2023 16:48:31 +0100 Subject: [PATCH] Removing offset from nodes #296 --- .../EqualityContractVerificationTest.java | 4 +- .../lisa/program/cfg/SemanticsSanityTest.java | 44 +- .../cfg/statement/global/AccessGlobal.java | 6 - .../callgraph/BaseCallGraph.java | 1 - .../serializableGraph/SerializableCFG.java | 75 ++-- .../statement/DefaultParamInitialization.java | 6 - .../program/cfg/statement/NaryExpression.java | 20 +- .../program/cfg/statement/NaryStatement.java | 18 +- .../lisa/program/cfg/statement/NoOp.java | 6 - .../unive/lisa/program/cfg/statement/Ret.java | 6 - .../lisa/program/cfg/statement/Statement.java | 19 +- .../program/cfg/statement/VariableRef.java | 9 +- .../statement/call/TruncatedParamsCall.java | 11 +- .../cfg/statement/literal/Literal.java | 6 - .../datastructures/graph/code/CodeNode.java | 19 - .../datastructures/graph/code/NodeList.java | 83 ++-- .../lisa/outputs/SerializableGraphTest.java | 389 ++++++++---------- .../graph/code/TestCodeGraph.java | 11 - 18 files changed, 286 insertions(+), 447 deletions(-) diff --git a/lisa/lisa-analyses/src/test/java/it/unive/lisa/EqualityContractVerificationTest.java b/lisa/lisa-analyses/src/test/java/it/unive/lisa/EqualityContractVerificationTest.java index 213f4da5e..39ac33400 100644 --- a/lisa/lisa-analyses/src/test/java/it/unive/lisa/EqualityContractVerificationTest.java +++ b/lisa/lisa-analyses/src/test/java/it/unive/lisa/EqualityContractVerificationTest.java @@ -314,7 +314,7 @@ public void testCollections() { verify(AdjacencyMatrix.class); verify(NodeEdges.class); verify(NodeList.class, - verifier -> verifier.withIgnoredFields("nextOffset", "sequentialSingleton", "computeOffsets")); + verifier -> verifier.withIgnoredFields("sequentialSingleton")); verify(it.unive.lisa.util.datastructures.graph.code.NodeList.NodeEdges.class); verify(ConcurrentFIFOWorkingSet.class); @@ -386,7 +386,7 @@ public void testStatements() { // suppress nullity: the verifier will try to pass in a code location // with null fields (not possible) and this would cause warnings - List statementFields = List.of("cfg", "offset"); + List statementFields = List.of("cfg"); List expressionFields = ListUtils.union(statementFields, List.of("parent", "metaVariables")); 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 7913bbfa8..9251e6957 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 @@ -2,6 +2,26 @@ import static org.junit.Assert.fail; +import java.lang.reflect.Constructor; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; + +import org.junit.Before; +import org.junit.Test; +import org.reflections.Reflections; +import org.reflections.scanners.SubTypesScanner; + import it.unive.lisa.analysis.AbstractState; import it.unive.lisa.analysis.AnalysisState; import it.unive.lisa.analysis.AnalyzedCFG; @@ -75,24 +95,6 @@ import it.unive.lisa.util.datastructures.graph.GraphVisitor; import it.unive.lisa.util.representation.StringRepresentation; import it.unive.lisa.util.representation.StructuredRepresentation; -import java.lang.reflect.Constructor; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; -import org.junit.Before; -import org.junit.Test; -import org.reflections.Reflections; -import org.reflections.scanners.SubTypesScanner; public class SemanticsSanityTest { @@ -176,12 +178,6 @@ public void setup() throws CallGraphConstructionException, InterproceduralAnalys store = new StatementStore<>(as); fake = new Expression(cfg, unknownLocation) { - @Override - public int setOffset( - int offset) { - return 0; - } - @Override public boolean accept( GraphVisitor visitor, 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 ded758404..238dc6f34 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 @@ -72,12 +72,6 @@ public Global getTarget() { return target; } - @Override - public int setOffset( - int offset) { - return this.offset = offset; - } - @Override public boolean accept( GraphVisitor visitor, diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/interprocedural/callgraph/BaseCallGraph.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/interprocedural/callgraph/BaseCallGraph.java index f3ba0fb2f..e84ffa195 100644 --- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/interprocedural/callgraph/BaseCallGraph.java +++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/interprocedural/callgraph/BaseCallGraph.java @@ -190,7 +190,6 @@ else if (onlyNativeCFGTargets(targets, nativeTargets, targetsNoRec, nativeTarget else resolved = new MultiCall(call, cfgcall, cfgcallnorec, nativecall, nativecallnorec); - resolved.setOffset(call.getOffset()); resolved.setSource(call); resolvedCache.computeIfAbsent(call, c -> new HashMap<>()).put(typeList, resolved); diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/outputs/serializableGraph/SerializableCFG.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/outputs/serializableGraph/SerializableCFG.java index 009a730b4..537186e20 100644 --- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/outputs/serializableGraph/SerializableCFG.java +++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/outputs/serializableGraph/SerializableCFG.java @@ -1,14 +1,6 @@ package it.unive.lisa.outputs.serializableGraph; -import it.unive.lisa.analysis.AnalyzedCFG; -import it.unive.lisa.program.cfg.CFG; -import it.unive.lisa.program.cfg.edge.Edge; -import it.unive.lisa.program.cfg.statement.NaryExpression; -import it.unive.lisa.program.cfg.statement.NaryStatement; -import it.unive.lisa.program.cfg.statement.Statement; -import it.unive.lisa.util.datastructures.graph.GraphVisitor; import java.util.Arrays; -import java.util.Collections; import java.util.IdentityHashMap; import java.util.LinkedList; import java.util.List; @@ -18,6 +10,16 @@ import java.util.function.BiFunction; import java.util.stream.Collectors; +import org.apache.commons.lang3.tuple.Pair; + +import it.unive.lisa.analysis.AnalyzedCFG; +import it.unive.lisa.program.cfg.CFG; +import it.unive.lisa.program.cfg.edge.Edge; +import it.unive.lisa.program.cfg.statement.NaryExpression; +import it.unive.lisa.program.cfg.statement.NaryStatement; +import it.unive.lisa.program.cfg.statement.Statement; +import it.unive.lisa.util.datastructures.graph.GraphVisitor; + /** * Utility class to build {@link SerializableGraph}s from {@link CFG}s. * @@ -66,55 +68,70 @@ public static SerializableGraph fromCFG( SortedSet descrs = new TreeSet<>(); SortedSet edges = new TreeSet<>(); - for (Statement node : source.getNodes()) { - Map> inners = new IdentityHashMap<>(); - node.accept(new InnerNodeExtractor(), inners); - for (Statement inner : inners.keySet()) - addNode(source, nodes, descrs, inner, inners.getOrDefault(inner, Collections.emptyList()), - descriptionGenerator); - addNode(source, nodes, descrs, node, inners.getOrDefault(node, Collections.emptyList()), - descriptionGenerator); - } + OffsetGenerator gen = new OffsetGenerator(); + source.accept(gen, null); + + for (Statement node : source.getNodes()) + process(source, nodes, descrs, node, descriptionGenerator, gen.result); - for (Statement src : source.getNodes()) - for (Statement dest : source.followersOf(src)) - for (Edge edge : source.getEdgesConnecting(src, dest)) - edges.add(new SerializableEdge(src.getOffset(), dest.getOffset(), edge.getClass().getSimpleName())); + for (Edge edge : source.getEdges()) + edges.add(new SerializableEdge( + gen.result.get(edge.getSource()).getLeft(), + gen.result.get(edge.getDestination()).getLeft(), + edge.getClass().getSimpleName())); return new SerializableGraph(name, desc, nodes, edges, descrs); } + private static void process( + CFG source, + SortedSet nodes, + SortedSet descrs, + Statement node, + BiFunction descriptionGenerator, + Map>> mapping) { + Pair> p = mapping.get(node); + for (Statement inner : p.getRight()) + process(source, nodes, descrs, inner, descriptionGenerator, mapping); + List innerIds = p.getValue().stream().map(st -> mapping.get(st).getKey()).collect(Collectors.toList()); + addNode(source, nodes, descrs, node, p.getKey(), innerIds, descriptionGenerator); + } + private static void addNode( CFG source, SortedSet nodes, SortedSet descrs, Statement node, - List inners, + Integer offset, + List inners, BiFunction descriptionGenerator) { - List innerIds = inners.stream().map(st -> st.getOffset()).collect(Collectors.toList()); - SerializableNode n = new SerializableNode(node.getOffset(), innerIds, node.toString()); + SerializableNode n = new SerializableNode(offset, inners, node.toString()); nodes.add(n); if (descriptionGenerator != null) { SerializableValue value = descriptionGenerator.apply(source, node); if (value != null) - descrs.add(new SerializableNodeDescription(node.getOffset(), value)); + descrs.add(new SerializableNodeDescription(offset, value)); } } - private static class InnerNodeExtractor + private static class OffsetGenerator implements - GraphVisitor>> { + GraphVisitor { + + private int offset = 0; + private Map>> result = new IdentityHashMap<>(); @Override public boolean visit( - Map> tool, + Void tool, CFG graph, Statement node) { - List inners = tool.computeIfAbsent(node, st -> new LinkedList<>()); + List inners = new LinkedList<>(); if (node instanceof NaryStatement) inners.addAll(Arrays.asList(((NaryStatement) node).getSubExpressions())); else if (node instanceof NaryExpression) inners.addAll(Arrays.asList(((NaryExpression) node).getSubExpressions())); + result.put(node, Pair.of(offset++, inners)); return true; } } 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 f283c196d..67b9d2b5d 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,12 +41,6 @@ public DefaultParamInitialization( super(cfg, location, type); } - @Override - public int setOffset( - int offset) { - throw new UnsupportedOperationException(); - } - @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 201eb9443..04ae23ef1 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 @@ -1,5 +1,11 @@ package it.unive.lisa.program.cfg.statement; +import java.util.Arrays; +import java.util.Collection; +import java.util.Objects; + +import org.apache.commons.lang3.StringUtils; + import it.unive.lisa.analysis.AbstractState; import it.unive.lisa.analysis.AnalysisState; import it.unive.lisa.analysis.SemanticException; @@ -15,10 +21,6 @@ import it.unive.lisa.type.Type; import it.unive.lisa.type.Untyped; import it.unive.lisa.util.datastructures.graph.GraphVisitor; -import java.util.Arrays; -import java.util.Collection; -import java.util.Objects; -import org.apache.commons.lang3.StringUtils; /** * A generic expression with {@code n} sub-expressions. @@ -164,16 +166,6 @@ public EvaluationOrder getOrder() { return order; } - @Override - public int setOffset( - int offset) { - this.offset = offset; - int off = offset; - for (Expression sub : subExpressions) - off = sub.setOffset(off + 1); - return off; - } - @Override public Statement getStatementEvaluatedBefore( Statement other) { 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 f9319fe32..1ff792103 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 @@ -1,5 +1,10 @@ package it.unive.lisa.program.cfg.statement; +import java.util.Arrays; +import java.util.Objects; + +import org.apache.commons.lang3.StringUtils; + import it.unive.lisa.analysis.AbstractState; import it.unive.lisa.analysis.AnalysisState; import it.unive.lisa.analysis.SemanticException; @@ -12,9 +17,6 @@ import it.unive.lisa.program.cfg.statement.evaluation.EvaluationOrder; import it.unive.lisa.program.cfg.statement.evaluation.LeftToRightEvaluation; import it.unive.lisa.util.datastructures.graph.GraphVisitor; -import java.util.Arrays; -import java.util.Objects; -import org.apache.commons.lang3.StringUtils; /** * A generic statement with {@code n} sub-expressions. @@ -115,16 +117,6 @@ public EvaluationOrder getOrder() { return order; } - @Override - public int setOffset( - int offset) { - this.offset = offset; - int off = offset; - for (Expression sub : subExpressions) - off = sub.setOffset(off + 1); - return off; - } - @Override public final boolean accept( GraphVisitor visitor, 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 f69ab20e5..07ceeb3eb 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 @@ -32,12 +32,6 @@ public NoOp( super(cfg, location); } - @Override - public int setOffset( - int offset) { - return this.offset = offset; - } - @Override public int hashCode() { return super.hashCode() ^ getClass().getName().hashCode(); 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 97d47840d..9d0ac2646 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 @@ -33,12 +33,6 @@ public Ret( super(cfg, location); } - @Override - public int setOffset( - int offset) { - return this.offset = offset; - } - @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 f70c42342..d63e5128f 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 @@ -1,5 +1,7 @@ package it.unive.lisa.program.cfg.statement; +import java.util.Objects; + import it.unive.lisa.analysis.AbstractState; import it.unive.lisa.analysis.AnalysisState; import it.unive.lisa.analysis.SemanticException; @@ -11,7 +13,6 @@ import it.unive.lisa.program.cfg.edge.Edge; import it.unive.lisa.program.cfg.statement.call.Call; import it.unive.lisa.util.datastructures.graph.code.CodeNode; -import java.util.Objects; /** * A statement of the program to analyze. @@ -25,11 +26,6 @@ public abstract class Statement implements CodeNode, Progr */ private final CFG cfg; - /** - * The offset of the statement within the cfg. - */ - protected int offset; - /** * The location where this statement happens. */ @@ -49,7 +45,6 @@ protected Statement( Objects.requireNonNull(location, "The location of a statement cannot be null"); this.cfg = cfg; this.location = location; - this.offset = -1; } @Override @@ -57,11 +52,6 @@ public final CFG getCFG() { return cfg; } - @Override - public final int getOffset() { - return offset; - } - /** * Whether or not this statement stops the execution of the containing cfg, * either by throwing an error or returning a value. To distinguish @@ -183,10 +173,7 @@ public CodeLocation getLocation() { @Override public int compareTo( Statement o) { - int cmp; - if ((cmp = location.compareTo(o.location)) != 0) - return cmp; - return Integer.compare(offset, o.offset); + return location.compareTo(o.location); } /** 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 bffba0b46..841d39a26 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 @@ -1,5 +1,7 @@ package it.unive.lisa.program.cfg.statement; +import java.util.Objects; + import it.unive.lisa.analysis.AbstractState; import it.unive.lisa.analysis.AnalysisState; import it.unive.lisa.analysis.SemanticException; @@ -16,7 +18,6 @@ import it.unive.lisa.type.Type; import it.unive.lisa.type.Untyped; import it.unive.lisa.util.datastructures.graph.GraphVisitor; -import java.util.Objects; /** * A reference to a variable of the current CFG, identified by its name. @@ -65,12 +66,6 @@ public VariableRef( this.name = name; } - @Override - public int setOffset( - int offset) { - return this.offset = offset; - } - /** * Yields the name of this variable. * 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 f0dc374f5..8a0986b31 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 @@ -1,5 +1,7 @@ package it.unive.lisa.program.cfg.statement.call; +import java.util.Collection; + import it.unive.lisa.analysis.AbstractState; import it.unive.lisa.analysis.AnalysisState; import it.unive.lisa.analysis.SemanticException; @@ -8,7 +10,6 @@ import it.unive.lisa.interprocedural.InterproceduralAnalysis; import it.unive.lisa.program.cfg.CodeMember; import it.unive.lisa.program.cfg.statement.Expression; -import java.util.Collection; /** * A call that wraps another one that has been created through @@ -36,14 +37,6 @@ public TruncatedParamsCall( this.call = call; } - @Override - public int setOffset( - int offset) { - // we do not reset the offsets here - Expression[] params = getParameters(); - return params[params.length - 1].getOffset(); - } - @Override public void setSource( UnresolvedCall source) { 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 de34a7a03..c33abb17f 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 @@ -56,12 +56,6 @@ public E getValue() { return value; } - @Override - public int setOffset( - int offset) { - return this.offset = offset; - } - @Override public int hashCode() { final int prime = 31; diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/graph/code/CodeNode.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/graph/code/CodeNode.java index b1a1cbea1..6b7b75426 100644 --- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/graph/code/CodeNode.java +++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/graph/code/CodeNode.java @@ -15,23 +15,4 @@ public interface CodeNode, N extends CodeNode, Comparable { - - /** - * Sets the offset of this node to the given value, and then proceeds by - * setting the one of its nested nodes (if any) to subsequent values. The - * last offset used is returned. - * - * @param offset the offset to set - * - * @return the last offset used while setting the offsets of nested nodes - */ - int setOffset( - int offset); - - /** - * Yields the offset of this node relative to its containing graph. - * - * @return the offset - */ - int getOffset(); } diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/graph/code/NodeList.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/graph/code/NodeList.java index 820bf825e..68a557bcf 100644 --- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/graph/code/NodeList.java +++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/graph/code/NodeList.java @@ -1,9 +1,6 @@ package it.unive.lisa.util.datastructures.graph.code; -import it.unive.lisa.program.ProgramValidationException; -import it.unive.lisa.util.collections.CollectionUtilities.SortedSetCollector; -import it.unive.lisa.util.datastructures.graph.Edge; -import it.unive.lisa.util.datastructures.graph.Node; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -16,15 +13,17 @@ import java.util.Map.Entry; import java.util.Queue; import java.util.Set; -import java.util.SortedMap; -import java.util.SortedSet; -import java.util.TreeMap; -import java.util.TreeSet; import java.util.stream.Collectors; import java.util.stream.Stream; + import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; +import it.unive.lisa.program.ProgramValidationException; +import it.unive.lisa.util.collections.CollectionUtilities.SortedSetCollector; +import it.unive.lisa.util.datastructures.graph.Edge; +import it.unive.lisa.util.datastructures.graph.Node; + /** * A list of nodes of a {@link CodeGraph}, together with the edges connecting * them. @@ -57,25 +56,13 @@ public class NodeList, N extends CodeNode, * Mapping from each node to all the edges that cannot be represented as * sequential exection through {@link #nodes}. */ - private final SortedMap> extraEdges; + private final Map> extraEdges; /** * A singleton to be used for creating sequential edges. */ private final E sequentialSingleton; - /** - * The next available offset to be assigned to the next node - */ - private int nextOffset; - - /** - * If true, this list will compute offsets of its nodes. This can be turned - * off for lists that serve as views of other lists, thus not representing - * the whole code of a graph. - */ - private final boolean computeOffsets; - /** * Builds a new list. Offsets of nodes added to this list will be set * automatically. @@ -106,9 +93,7 @@ public NodeList( this.sequentialSingleton = sequentialSingleton; nodes = new LinkedList<>(); cutoff = new HashSet<>(); - extraEdges = new TreeMap<>(); - nextOffset = 0; - this.computeOffsets = computeOffsets; + extraEdges = new HashMap<>(); } /** @@ -121,11 +106,9 @@ public NodeList( sequentialSingleton = other.sequentialSingleton; nodes = new LinkedList<>(other.nodes); cutoff = new HashSet<>(other.cutoff); - extraEdges = new TreeMap<>(); + extraEdges = new HashMap<>(); for (Entry> entry : other.extraEdges.entrySet()) extraEdges.put(entry.getKey(), new NodeEdges<>(entry.getValue())); - nextOffset = other.nextOffset; - computeOffsets = other.computeOffsets; } /** @@ -149,8 +132,6 @@ public void addNode( if (size != 0) cutoff.add(size - 1); nodes.add(node); - if (computeOffsets) - nextOffset = node.setOffset(nextOffset) + 1; } /** @@ -198,17 +179,6 @@ public void removeNode( } else cutoff.add(target - 1); } - - recomputeOffsets(); - } - - private void recomputeOffsets() { - if (!computeOffsets) - return; - int of = 0; - for (N node : nodes) - of = node.setOffset(of) + 1; - nextOffset = of; } /** @@ -217,7 +187,7 @@ private void recomputeOffsets() { * @return the collection of nodes */ public final Collection getNodes() { - return new TreeSet<>(nodes); + return new ArrayList<>(nodes); } /** @@ -330,7 +300,7 @@ public Collection getEdgesConnecting( if (src == -1 || dest == -1) return Collections.emptySet(); - SortedSet result = new TreeSet<>(); + Set result = new HashSet<>(); if (src == dest - 1 && !cutoff.contains(src)) result.add(sequentialSingleton.newInstance(source, destination)); @@ -356,7 +326,7 @@ public final Collection getIngoingEdges( if (src == -1) return Collections.emptySet(); - SortedSet result = new TreeSet<>(); + Set result = new HashSet<>(); if (src != 0 && !cutoff.contains(src - 1)) result.add(sequentialSingleton.newInstance(nodes.get(src - 1), node)); @@ -380,7 +350,7 @@ public final Collection getOutgoingEdges( if (src == -1) return Collections.emptySet(); - SortedSet result = new TreeSet<>(); + Set result = new HashSet<>(); if (src != nodes.size() - 1 && !cutoff.contains(src)) result.add(sequentialSingleton.newInstance(node, nodes.get(src + 1))); @@ -397,10 +367,10 @@ public final Collection getOutgoingEdges( * @return the collection of edges */ public final Collection getEdges() { - SortedSet result = extraEdges.values().stream() + Set result = extraEdges.values().stream() .flatMap(c -> Stream.concat(c.ingoing.stream(), c.outgoing.stream())) .distinct() - .collect(new SortedSetCollector<>()); + .collect(Collectors.toSet()); for (int i = 0; i < nodes.size() - 1; i++) if (!cutoff.contains(i)) result.add(sequentialSingleton.newInstance(nodes.get(i), nodes.get(i + 1))); @@ -424,7 +394,7 @@ public final Collection followersOf( if (src == -1) throw new IllegalArgumentException("'" + node + "' is not in the graph"); - SortedSet result = new TreeSet<>(); + Set result = new HashSet<>(); if (src != nodes.size() - 1 && !cutoff.contains(src)) result.add(nodes.get(src + 1)); @@ -452,7 +422,7 @@ public final Collection predecessorsOf( if (src == -1) throw new IllegalArgumentException("'" + node + "' is not in the graph"); - SortedSet result = new TreeSet<>(); + Set result = new HashSet<>(); if (src != 0 && !cutoff.contains(src - 1)) result.add(nodes.get(src - 1)); @@ -545,9 +515,6 @@ else if (!ingoing.isEmpty() && outgoing.isEmpty()) removeNode(t); } - - if (!removedEdges.isEmpty() || !replacedEdges.isEmpty()) - recomputeOffsets(); } /** @@ -637,7 +604,7 @@ public String toString() { for (int i = 0; i < nodes.size(); i++) { N node = nodes.get(i); - res.append(node.getOffset()).append(": ").append(node); + res.append(node); NodeEdges edges = extraEdges.get(node); if (edges != null) { @@ -851,18 +818,18 @@ else if (!nodes.contains(edge.getDestination())) public static class NodeEdges, N extends CodeNode, E extends CodeEdge> { - private final SortedSet ingoing; - private final SortedSet outgoing; + private final Set ingoing; + private final Set outgoing; private NodeEdges() { - ingoing = new TreeSet<>(); - outgoing = new TreeSet<>(); + ingoing = new HashSet<>(); + outgoing = new HashSet<>(); } private NodeEdges( NodeEdges other) { - ingoing = new TreeSet<>(other.ingoing); - outgoing = new TreeSet<>(other.outgoing); + ingoing = new HashSet<>(other.ingoing); + outgoing = new HashSet<>(other.outgoing); } /** diff --git a/lisa/lisa-sdk/src/test/java/it/unive/lisa/outputs/SerializableGraphTest.java b/lisa/lisa-sdk/src/test/java/it/unive/lisa/outputs/SerializableGraphTest.java index 065f367e2..1bc30959b 100644 --- a/lisa/lisa-sdk/src/test/java/it/unive/lisa/outputs/SerializableGraphTest.java +++ b/lisa/lisa-sdk/src/test/java/it/unive/lisa/outputs/SerializableGraphTest.java @@ -2,6 +2,14 @@ import static org.junit.Assert.assertEquals; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.SortedSet; +import java.util.TreeSet; + +import org.junit.Test; + import it.unive.lisa.TestLanguageFeatures; import it.unive.lisa.TestTypeSystem; import it.unive.lisa.outputs.serializableGraph.SerializableCFG; @@ -21,12 +29,6 @@ import it.unive.lisa.program.cfg.statement.Return; import it.unive.lisa.program.cfg.statement.Statement; import it.unive.lisa.program.cfg.statement.VariableRef; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.SortedSet; -import java.util.TreeSet; -import org.junit.Test; public class SerializableGraphTest { @@ -36,18 +38,20 @@ public class SerializableGraphTest { private static void addNode( SortedSet nodes, Statement st, - Statement... inner) { + int offset, + int... inner) { List list = new ArrayList<>(inner.length); for (int i = 0; i < inner.length; i++) - list.add(inner[i].getOffset()); - nodes.add(new SerializableNode(st.getOffset(), list, st.toString())); + list.add(inner[i]); + nodes.add(new SerializableNode(offset, list, st.toString())); } private static void addEdge( SortedSet edges, - Edge e) { - edges.add(new SerializableEdge(e.getSource().getOffset(), e.getDestination().getOffset(), - e.getClass().getSimpleName())); + Edge e, + int src, + int dest) { + edges.add(new SerializableEdge(src, dest, e.getClass().getSimpleName())); } @Test @@ -56,11 +60,8 @@ public void testSimpleIf() { VariableRef c1 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "1"); VariableRef c2 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "2"); - ; VariableRef c3 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "3"); - ; VariableRef c4 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "4"); - ; VariableRef lvar = new VariableRef(cfg, SyntheticLocation.INSTANCE, "l"); VariableRef rvar = new VariableRef(cfg, SyntheticLocation.INSTANCE, "r"); VariableRef xvar = new VariableRef(cfg, SyntheticLocation.INSTANCE, "x"); @@ -88,79 +89,72 @@ public void testSimpleIf() { SortedSet nodes = new TreeSet<>(); SortedSet edges = new TreeSet<>(); - addNode(nodes, c1); - addNode(nodes, c2); - addNode(nodes, c3); - addNode(nodes, c4); - addNode(nodes, lvar); - addNode(nodes, rvar); - addNode(nodes, xvar); - addNode(nodes, condition, c1, c2); - addNode(nodes, a1, lvar, c3); - addNode(nodes, a2, rvar, c4); - addNode(nodes, ret, xvar); - - addEdge(edges, e1); - addEdge(edges, e2); - addEdge(edges, e3); - addEdge(edges, e4); - - SerializableGraph expected = new SerializableGraph(cfg.getDescriptor().getFullSignatureWithParNames(), null, - nodes, edges, Collections.emptySortedSet()); + addNode(nodes, c1, 0); + addNode(nodes, c2, 1); + addNode(nodes, condition, 2, 0, 1); + addNode(nodes, lvar, 3); + addNode(nodes, c3, 4); + addNode(nodes, a1, 5, 3, 4); + addNode(nodes, rvar, 6); + addNode(nodes, c4, 7); + addNode(nodes, a2, 8, 6, 7); + addNode(nodes, xvar, 9); + addNode(nodes, ret, 10, 9); + + addEdge(edges, e1, 2, 5); + addEdge(edges, e2, 2, 8); + addEdge(edges, e3, 5, 10); + addEdge(edges, e4, 8, 10); + + SerializableGraph expected = new SerializableGraph( + cfg.getDescriptor().getFullSignatureWithParNames(), + null, + nodes, + edges, + Collections.emptySortedSet()); assertEquals(expected, graph); } @Test public void testEmptyIf() { CFG cfg = new CFG(new CodeMemberDescriptor(SyntheticLocation.INSTANCE, unit, false, "emptyIf")); - VariableRef c1 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "1"); - ; VariableRef c2 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "2"); - ; VariableRef xvar = new VariableRef(cfg, SyntheticLocation.INSTANCE, "x"); Assignment condition = new Assignment(cfg, SyntheticLocation.INSTANCE, c1, c2); Return ret = new Return(cfg, SyntheticLocation.INSTANCE, xvar); - cfg.addNode(condition, true); cfg.addNode(ret); - Edge e1 = new TrueEdge(condition, ret); Edge e2 = new FalseEdge(condition, ret); cfg.addEdge(e1); cfg.addEdge(e2); - SerializableGraph graph = SerializableCFG.fromCFG(cfg); - SortedSet nodes = new TreeSet<>(); SortedSet edges = new TreeSet<>(); - - addNode(nodes, c1); - addNode(nodes, c2); - addNode(nodes, xvar); - addNode(nodes, condition, c1, c2); - addNode(nodes, ret, xvar); - - addEdge(edges, e1); - addEdge(edges, e2); - - SerializableGraph expected = new SerializableGraph(cfg.getDescriptor().getFullSignatureWithParNames(), null, - nodes, edges, Collections.emptySortedSet()); + addNode(nodes, c1, 0); + addNode(nodes, c2, 1); + addNode(nodes, condition, 2, 0, 1); + addNode(nodes, xvar, 3); + addNode(nodes, ret, 4, 3); + addEdge(edges, e1, 2, 4); + addEdge(edges, e2, 2, 4); + SerializableGraph expected = new SerializableGraph( + cfg.getDescriptor().getFullSignatureWithParNames(), + null, + nodes, + edges, + Collections.emptySortedSet()); assertEquals(expected, graph); } @Test public void testIfWithEmptyBranch() { CFG cfg = new CFG(new CodeMemberDescriptor(SyntheticLocation.INSTANCE, unit, false, "emptyBranch")); - VariableRef c1 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "1"); - ; VariableRef c2 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "2"); - ; VariableRef c3 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "3"); - ; VariableRef c4 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "4"); - ; VariableRef lvar = new VariableRef(cfg, SyntheticLocation.INSTANCE, "l"); VariableRef rvar = new VariableRef(cfg, SyntheticLocation.INSTANCE, "r"); VariableRef xvar = new VariableRef(cfg, SyntheticLocation.INSTANCE, "x"); @@ -168,12 +162,10 @@ public void testIfWithEmptyBranch() { Assignment a1 = new Assignment(cfg, SyntheticLocation.INSTANCE, lvar, c3); Assignment a2 = new Assignment(cfg, SyntheticLocation.INSTANCE, rvar, c4); Return ret = new Return(cfg, SyntheticLocation.INSTANCE, xvar); - cfg.addNode(condition, true); cfg.addNode(a1); cfg.addNode(a2); cfg.addNode(ret); - Edge e1 = new TrueEdge(condition, a1); Edge e2 = new FalseEdge(condition, ret); Edge e3 = new SequentialEdge(a1, a2); @@ -182,46 +174,40 @@ public void testIfWithEmptyBranch() { cfg.addEdge(e2); cfg.addEdge(e3); cfg.addEdge(e4); - SerializableGraph graph = SerializableCFG.fromCFG(cfg); - SortedSet nodes = new TreeSet<>(); SortedSet edges = new TreeSet<>(); - - addNode(nodes, c1); - addNode(nodes, c2); - addNode(nodes, c3); - addNode(nodes, c4); - addNode(nodes, lvar); - addNode(nodes, rvar); - addNode(nodes, xvar); - addNode(nodes, condition, c1, c2); - addNode(nodes, a1, lvar, c3); - addNode(nodes, a2, rvar, c4); - addNode(nodes, ret, xvar); - - addEdge(edges, e1); - addEdge(edges, e2); - addEdge(edges, e3); - addEdge(edges, e4); - - SerializableGraph expected = new SerializableGraph(cfg.getDescriptor().getFullSignatureWithParNames(), null, - nodes, edges, Collections.emptySortedSet()); + addNode(nodes, c1, 0); + addNode(nodes, c2, 1); + addNode(nodes, condition, 2, 0, 1); + addNode(nodes, lvar, 3); + addNode(nodes, c3, 4); + addNode(nodes, a1, 5, 3, 4); + addNode(nodes, rvar, 6); + addNode(nodes, c4, 7); + addNode(nodes, a2, 8, 6, 7); + addNode(nodes, xvar, 9); + addNode(nodes, ret, 10, 9); + addEdge(edges, e1, 2, 5); + addEdge(edges, e2, 2, 10); + addEdge(edges, e3, 5, 8); + addEdge(edges, e4, 8, 10); + SerializableGraph expected = new SerializableGraph( + cfg.getDescriptor().getFullSignatureWithParNames(), + null, + nodes, + edges, + Collections.emptySortedSet()); assertEquals(expected, graph); } @Test public void testAsymmetricIf() { CFG cfg = new CFG(new CodeMemberDescriptor(SyntheticLocation.INSTANCE, unit, false, "asymmetricIf")); - VariableRef c1 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "1"); - ; VariableRef c2 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "2"); - ; VariableRef c3 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "3"); - ; VariableRef c4 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "4"); - ; VariableRef c5 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "5"); VariableRef lvar = new VariableRef(cfg, SyntheticLocation.INSTANCE, "l"); VariableRef rvar = new VariableRef(cfg, SyntheticLocation.INSTANCE, "r"); @@ -232,13 +218,11 @@ public void testAsymmetricIf() { Assignment a2 = new Assignment(cfg, SyntheticLocation.INSTANCE, rvar, c4); Assignment a3 = new Assignment(cfg, SyntheticLocation.INSTANCE, xvar, c5); Return ret = new Return(cfg, SyntheticLocation.INSTANCE, yvar); - cfg.addNode(condition, true); cfg.addNode(a1); cfg.addNode(a2); cfg.addNode(a3); cfg.addNode(ret); - Edge e1 = new TrueEdge(condition, a1); Edge e2 = new FalseEdge(condition, a2); Edge e3 = new SequentialEdge(a1, a3); @@ -249,50 +233,44 @@ public void testAsymmetricIf() { cfg.addEdge(e3); cfg.addEdge(e4); cfg.addEdge(e5); - SerializableGraph graph = SerializableCFG.fromCFG(cfg); - SortedSet nodes = new TreeSet<>(); SortedSet edges = new TreeSet<>(); - - addNode(nodes, c1); - addNode(nodes, c2); - addNode(nodes, c3); - addNode(nodes, c4); - addNode(nodes, c5); - addNode(nodes, lvar); - addNode(nodes, rvar); - addNode(nodes, xvar); - addNode(nodes, yvar); - addNode(nodes, condition, c1, c2); - addNode(nodes, a1, lvar, c3); - addNode(nodes, a2, rvar, c4); - addNode(nodes, a3, xvar, c5); - addNode(nodes, ret, yvar); - - addEdge(edges, e1); - addEdge(edges, e2); - addEdge(edges, e3); - addEdge(edges, e4); - addEdge(edges, e5); - - SerializableGraph expected = new SerializableGraph(cfg.getDescriptor().getFullSignatureWithParNames(), null, - nodes, edges, Collections.emptySortedSet()); + addNode(nodes, c1, 0); + addNode(nodes, c2, 1); + addNode(nodes, condition, 2, 0, 1); + addNode(nodes, lvar, 3); + addNode(nodes, c3, 4); + addNode(nodes, a1, 5, 3, 4); + addNode(nodes, rvar, 6); + addNode(nodes, c4, 7); + addNode(nodes, a2, 8, 6, 7); + addNode(nodes, xvar, 9); + addNode(nodes, c5, 10); + addNode(nodes, a3, 11, 9, 10); + addNode(nodes, yvar, 12); + addNode(nodes, ret, 13, 12); + addEdge(edges, e1, 2, 5); + addEdge(edges, e2, 2, 8); + addEdge(edges, e3, 5, 11); + addEdge(edges, e4, 8, 13); + addEdge(edges, e5, 11, 13); + SerializableGraph expected = new SerializableGraph( + cfg.getDescriptor().getFullSignatureWithParNames(), + null, + nodes, + edges, + Collections.emptySortedSet()); assertEquals(expected, graph); } @Test public void testSimpleLoop() { CFG cfg = new CFG(new CodeMemberDescriptor(SyntheticLocation.INSTANCE, unit, false, "simpleLoop")); - VariableRef c1 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "1"); - ; VariableRef c2 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "2"); - ; VariableRef c3 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "3"); - ; VariableRef c4 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "4"); - ; VariableRef lvar = new VariableRef(cfg, SyntheticLocation.INSTANCE, "l"); VariableRef rvar = new VariableRef(cfg, SyntheticLocation.INSTANCE, "r"); VariableRef xvar = new VariableRef(cfg, SyntheticLocation.INSTANCE, "x"); @@ -300,12 +278,10 @@ public void testSimpleLoop() { Assignment a1 = new Assignment(cfg, SyntheticLocation.INSTANCE, lvar, c3); Assignment a2 = new Assignment(cfg, SyntheticLocation.INSTANCE, rvar, c4); Return ret = new Return(cfg, SyntheticLocation.INSTANCE, xvar); - cfg.addNode(condition, true); cfg.addNode(a1); cfg.addNode(a2); cfg.addNode(ret); - Edge e1 = new TrueEdge(condition, a1); Edge e2 = new FalseEdge(condition, a2); Edge e3 = new SequentialEdge(a1, condition); @@ -314,96 +290,83 @@ public void testSimpleLoop() { cfg.addEdge(e2); cfg.addEdge(e3); cfg.addEdge(e4); - SerializableGraph graph = SerializableCFG.fromCFG(cfg); - SortedSet nodes = new TreeSet<>(); SortedSet edges = new TreeSet<>(); - - addNode(nodes, c1); - addNode(nodes, c2); - addNode(nodes, c3); - addNode(nodes, c4); - addNode(nodes, lvar); - addNode(nodes, rvar); - addNode(nodes, xvar); - addNode(nodes, condition, c1, c2); - addNode(nodes, a1, lvar, c3); - addNode(nodes, a2, rvar, c4); - addNode(nodes, ret, xvar); - - addEdge(edges, e1); - addEdge(edges, e2); - addEdge(edges, e3); - addEdge(edges, e4); - - SerializableGraph expected = new SerializableGraph(cfg.getDescriptor().getFullSignatureWithParNames(), null, - nodes, edges, Collections.emptySortedSet()); + addNode(nodes, c1, 0); + addNode(nodes, c2, 1); + addNode(nodes, condition, 2, 0, 1); + addNode(nodes, lvar, 3); + addNode(nodes, c3, 4); + addNode(nodes, a1, 5, 3, 4); + addNode(nodes, rvar, 6); + addNode(nodes, c4, 7); + addNode(nodes, a2, 8, 6, 7); + addNode(nodes, xvar, 9); + addNode(nodes, ret, 10, 9); + addEdge(edges, e1, 2, 5); + addEdge(edges, e2, 2, 8); + addEdge(edges, e3, 5, 2); + addEdge(edges, e4, 8, 10); + SerializableGraph expected = new SerializableGraph( + cfg.getDescriptor().getFullSignatureWithParNames(), + null, + nodes, + edges, + Collections.emptySortedSet()); assertEquals(expected, graph); } @Test public void testEmptyLoop() { CFG cfg = new CFG(new CodeMemberDescriptor(SyntheticLocation.INSTANCE, unit, false, "emptyLoop")); - VariableRef c1 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "1"); - ; VariableRef c2 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "2"); - ; VariableRef c4 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "4"); - ; VariableRef rvar = new VariableRef(cfg, SyntheticLocation.INSTANCE, "r"); VariableRef xvar = new VariableRef(cfg, SyntheticLocation.INSTANCE, "x"); Assignment condition = new Assignment(cfg, SyntheticLocation.INSTANCE, c1, c2); Assignment a2 = new Assignment(cfg, SyntheticLocation.INSTANCE, rvar, c4); Return ret = new Return(cfg, SyntheticLocation.INSTANCE, xvar); - cfg.addNode(condition, true); cfg.addNode(a2); cfg.addNode(ret); - Edge e1 = new TrueEdge(condition, condition); Edge e2 = new FalseEdge(condition, a2); Edge e4 = new SequentialEdge(a2, ret); cfg.addEdge(e1); cfg.addEdge(e2); cfg.addEdge(e4); - SerializableGraph graph = SerializableCFG.fromCFG(cfg); - SortedSet nodes = new TreeSet<>(); SortedSet edges = new TreeSet<>(); - - addNode(nodes, c1); - addNode(nodes, c2); - addNode(nodes, c4); - addNode(nodes, rvar); - addNode(nodes, xvar); - addNode(nodes, condition, c1, c2); - addNode(nodes, a2, rvar, c4); - addNode(nodes, ret, xvar); - - addEdge(edges, e1); - addEdge(edges, e2); - addEdge(edges, e4); - - SerializableGraph expected = new SerializableGraph(cfg.getDescriptor().getFullSignatureWithParNames(), null, - nodes, edges, Collections.emptySortedSet()); + addNode(nodes, c1, 0); + addNode(nodes, c2, 1); + addNode(nodes, condition, 2, 0, 1); + addNode(nodes, rvar, 3); + addNode(nodes, c4, 4); + addNode(nodes, a2, 5, 3, 4); + addNode(nodes, xvar, 6); + addNode(nodes, ret, 7, 6); + addEdge(edges, e1, 2, 2); + addEdge(edges, e2, 2, 5); + addEdge(edges, e4, 5, 7); + SerializableGraph expected = new SerializableGraph( + cfg.getDescriptor().getFullSignatureWithParNames(), + null, + nodes, + edges, + Collections.emptySortedSet()); assertEquals(expected, graph); } @Test public void testNestedConditionals() { CFG cfg = new CFG(new CodeMemberDescriptor(SyntheticLocation.INSTANCE, unit, false, "nested")); - VariableRef c1 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "1"); - ; VariableRef c2 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "2"); - ; VariableRef c3 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "3"); - ; VariableRef c4 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "4"); - ; VariableRef c5 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "5"); VariableRef c6 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "6"); VariableRef c7 = new VariableRef(cfg, SyntheticLocation.INSTANCE, "7"); @@ -423,7 +386,6 @@ public void testNestedConditionals() { Assignment if_a2 = new Assignment(cfg, SyntheticLocation.INSTANCE, if_a2var, c8); Assignment if_a3 = new Assignment(cfg, SyntheticLocation.INSTANCE, if_a3var, c9); Return ret = new Return(cfg, SyntheticLocation.INSTANCE, xvar); - cfg.addNode(loop_condition, true); cfg.addNode(loop_a1); cfg.addNode(loop_a2); @@ -432,7 +394,6 @@ public void testNestedConditionals() { cfg.addNode(if_a2); cfg.addNode(if_a3); cfg.addNode(ret); - Edge e1 = new TrueEdge(loop_condition, loop_a1); Edge e2 = new SequentialEdge(loop_a1, if_condition); Edge e3 = new TrueEdge(if_condition, if_a1); @@ -451,48 +412,48 @@ public void testNestedConditionals() { cfg.addEdge(e7); cfg.addEdge(e8); cfg.addEdge(e9); - SerializableGraph graph = SerializableCFG.fromCFG(cfg); - SortedSet nodes = new TreeSet<>(); SortedSet edges = new TreeSet<>(); - - addNode(nodes, c1); - addNode(nodes, c2); - addNode(nodes, c3); - addNode(nodes, c4); - addNode(nodes, c5); - addNode(nodes, c6); - addNode(nodes, c7); - addNode(nodes, c8); - addNode(nodes, c9); - addNode(nodes, loop_a1var); - addNode(nodes, loop_a2var); - addNode(nodes, if_a1var); - addNode(nodes, if_a2var); - addNode(nodes, if_a3var); - addNode(nodes, xvar); - addNode(nodes, loop_condition, c1, c2); - addNode(nodes, loop_a1, loop_a1var, c3); - addNode(nodes, loop_a2, loop_a2var, c4); - addNode(nodes, if_condition, c5, c6); - addNode(nodes, if_a1, if_a1var, c7); - addNode(nodes, if_a2, if_a2var, c8); - addNode(nodes, if_a3, if_a3var, c9); - addNode(nodes, ret, xvar); - - addEdge(edges, e1); - addEdge(edges, e2); - addEdge(edges, e3); - addEdge(edges, e4); - addEdge(edges, e5); - addEdge(edges, e6); - addEdge(edges, e7); - addEdge(edges, e8); - addEdge(edges, e9); - - SerializableGraph expected = new SerializableGraph(cfg.getDescriptor().getFullSignatureWithParNames(), null, - nodes, edges, Collections.emptySortedSet()); + addNode(nodes, c1, 0); + addNode(nodes, c2, 1); + addNode(nodes, loop_condition, 2, 0, 1); + addNode(nodes, loop_a1var, 3); + addNode(nodes, c3, 4); + addNode(nodes, loop_a1, 5, 3, 4); + addNode(nodes, loop_a2var, 6); + addNode(nodes, c4, 7); + addNode(nodes, loop_a2, 8, 6, 7); + addNode(nodes, c5, 9); + addNode(nodes, c6, 10); + addNode(nodes, if_condition, 11, 9, 10); + addNode(nodes, if_a1var, 12); + addNode(nodes, c7, 13); + addNode(nodes, if_a1, 14, 12, 13); + addNode(nodes, if_a2var, 15); + addNode(nodes, c8, 16); + addNode(nodes, if_a2, 17, 15, 16); + addNode(nodes, if_a3var, 18); + addNode(nodes, c9, 19); + addNode(nodes, if_a3, 20, 18, 19); + addNode(nodes, xvar, 21); + addNode(nodes, ret, 22, 21); + addEdge(edges, e1, 2, 5); + addEdge(edges, e2, 5, 11); + addEdge(edges, e3, 11, 14); + addEdge(edges, e4, 14, 20); + addEdge(edges, e5, 20, 8); + addEdge(edges, e6, 11, 17); + addEdge(edges, e7, 17, 8); + addEdge(edges, e8, 8, 2); + addEdge(edges, e9, 2, 22); + SerializableGraph expected = new SerializableGraph( + cfg.getDescriptor().getFullSignatureWithParNames(), + null, + nodes, + edges, + Collections.emptySortedSet()); assertEquals(expected, graph); } + } diff --git a/lisa/lisa-sdk/src/test/java/it/unive/lisa/util/datastructures/graph/code/TestCodeGraph.java b/lisa/lisa-sdk/src/test/java/it/unive/lisa/util/datastructures/graph/code/TestCodeGraph.java index 0a436009c..131a78f85 100644 --- a/lisa/lisa-sdk/src/test/java/it/unive/lisa/util/datastructures/graph/code/TestCodeGraph.java +++ b/lisa/lisa-sdk/src/test/java/it/unive/lisa/util/datastructures/graph/code/TestCodeGraph.java @@ -24,12 +24,6 @@ public boolean accept( return false; } - @Override - public int setOffset( - int offset) { - return offset; - } - @Override public String toString() { return String.valueOf(id); @@ -63,11 +57,6 @@ public int compareTo( TestCodeNode o) { return id - o.id; } - - @Override - public int getOffset() { - return 0; - } } public static class TestCodeEdge implements CodeEdge {