Skip to content

Commit

Permalink
Removing offset from nodes #296
Browse files Browse the repository at this point in the history
  • Loading branch information
lucaneg committed Dec 4, 2023
1 parent 5abb6d7 commit 6586dd7
Show file tree
Hide file tree
Showing 18 changed files with 286 additions and 447 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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<String> statementFields = List.of("cfg", "offset");
List<String> statementFields = List.of("cfg");
List<String> expressionFields = ListUtils.union(statementFields,
List.of("parent", "metaVariables"));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 {

Expand Down Expand Up @@ -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 <V> boolean accept(
GraphVisitor<CFG, Statement, Edge, V> visitor,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,12 +72,6 @@ public Global getTarget() {
return target;
}

@Override
public int setOffset(
int offset) {
return this.offset = offset;
}

@Override
public <V> boolean accept(
GraphVisitor<CFG, Statement, Edge, V> visitor,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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.
*
Expand Down Expand Up @@ -66,55 +68,70 @@ public static SerializableGraph fromCFG(
SortedSet<SerializableNodeDescription> descrs = new TreeSet<>();
SortedSet<SerializableEdge> edges = new TreeSet<>();

for (Statement node : source.getNodes()) {
Map<Statement, List<Statement>> 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<SerializableNode> nodes,
SortedSet<SerializableNodeDescription> descrs,
Statement node,
BiFunction<CFG, Statement, SerializableValue> descriptionGenerator,
Map<Statement, Pair<Integer, List<Statement>>> mapping) {
Pair<Integer, List<Statement>> p = mapping.get(node);
for (Statement inner : p.getRight())
process(source, nodes, descrs, inner, descriptionGenerator, mapping);
List<Integer> 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<SerializableNode> nodes,
SortedSet<SerializableNodeDescription> descrs,
Statement node,
List<Statement> inners,
Integer offset,
List<Integer> inners,
BiFunction<CFG, Statement, SerializableValue> descriptionGenerator) {
List<Integer> 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<CFG, Statement, Edge, Map<Statement, List<Statement>>> {
GraphVisitor<CFG, Statement, Edge, Void> {

private int offset = 0;
private Map<Statement, Pair<Integer, List<Statement>>> result = new IdentityHashMap<>();

@Override
public boolean visit(
Map<Statement, List<Statement>> tool,
Void tool,
CFG graph,
Statement node) {
List<Statement> inners = tool.computeIfAbsent(node, st -> new LinkedList<>());
List<Statement> 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;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,6 @@ public DefaultParamInitialization(
super(cfg, location, type);
}

@Override
public int setOffset(
int offset) {
throw new UnsupportedOperationException();
}

@Override
public <V> boolean accept(
GraphVisitor<CFG, Statement, Edge, V> visitor,
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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.
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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.
Expand Down Expand Up @@ -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 <V> boolean accept(
GraphVisitor<CFG, Statement, Edge, V> visitor,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Loading

0 comments on commit 6586dd7

Please sign in to comment.