Commit 830c6df6 authored by Carlos Galindo's avatar Carlos Galindo
Browse files

Tabular slicing (v1): non-recursive

- Move summary settings from EDGFactory to Config.
- The EDG now contains a SummaryTable, a map which computes summaries on-the-fly.
- ConstrainedAlgorithm: now looks up summary edges in SummaryTable.
- Fixed typo in SummaryEdgeGenerator#generateOnlyExternal.
parent 52e49b10
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ import java.util.List;
import java.util.Set;
import java.util.function.Predicate;

import edg.config.Config;
import edg.constraint.*;
import edg.edge.*;
import edg.graph.Node;
@@ -15,8 +16,7 @@ import edg.graph.LAST;
public class EDGFactory {
	private final LAST last;
	private EDG edg;
	private boolean interproceduralGraph;
	private boolean summarisedGraph = false;
	private final boolean interproceduralGraph;

	public EDGFactory(LAST last) {
		this(last, true);
@@ -105,11 +105,11 @@ public class EDGFactory {
		edg.getGenerationTime().setFlowTime((finalFlow-initialFlow) / 1000000.0);

		// WE ARE NOT GENERATING SUMMARIES
		if (summarisedGraph)
		if (Config.summaries)
			new SummaryEdgeGenerator(edg).generate();
		else
			//new SummaryEdgeGenerator(edg).generateAsExternal();
			new SummaryEdgeGenerator(edg).generateeOnlyExternal();
			new SummaryEdgeGenerator(edg).generateOnlyExternal();


		// new ExceptionEdgeGenerator(edg).generate();
+2 −0
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@ public final class Config extends misc.Config
	public static final boolean PDG = true;
	public static final boolean APDG = false;
	public static final boolean PPDG = false;
	public static final boolean summaries = false;
	public static final boolean tabulatedSlicing = true;
	public static Config getConfig()
	{
		return Config.config;
+1 −1
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ public class SummaryEdgeGenerator extends EdgeGenerator
		this.generateSummaryEdgesAsExternal();
	}

	public void generateeOnlyExternal(){
	public void generateOnlyExternal(){
		this.generateExternalSummaryEdges();
	}

+8 −0
Original line number Diff line number Diff line
@@ -3,12 +3,16 @@ package edg.graph;
import edg.constraint.Constraints;
import edg.constraint.GrammarConstraint;
import edg.slicing.SlicingCriterion;
import edg.slicing.SummaryTable;

import java.util.Comparator;
import java.util.List;
import java.util.Objects;

public class EDG extends LAST {

	protected final SummaryTable summaryTable = new SummaryTable(this);

	/** Create an empty EDG with an empty AST. */
	public EDG()
	{
@@ -29,6 +33,10 @@ public class EDG extends LAST {
		this.getGenerationTime().setCompositeTime(last.getCompositeStructureTime());
	}

	public List<SummaryTable.Value> getTableSummary(Node actualOut, Constraints stack) {
		return summaryTable.get(actualOut, stack);
	}

	// ================================================= //
	// ===================== NODES ===================== //
	// ================================================= //
+22 −0
Original line number Diff line number Diff line
package edg.slicing;

import edg.config.Config;
import edg.constraint.Constraints;
import edg.constraint.EdgeConstraint;
import edg.constraint.NodeConstraint;
@@ -17,6 +18,10 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Set;

/**
 * A field-sensitive slicing algorithm for the EDG, constrained
 * by the edges traversed during the slice.
 */
public class ConstrainedAlgorithm implements SlicingAlgorithm
{
	protected final EDG edg;
@@ -78,6 +83,12 @@ public class ConstrainedAlgorithm implements SlicingAlgorithm
									edge.getType() == Edge.Type.Call);
		}

		if (Config.tabulatedSlicing && isArgumentOut(currentNode)) {
			edges.removeIf(e -> e.getType() == Edge.Type.Summary);
			for (SummaryTable.Value v : edg.getTableSummary(currentNode, constraints))
				newWorks.add(v.createWork(initialNode, work.getTraversedEdges()));
		}

		// TRAVERSAL RESTRICTION TODO: Change this restriction to construction time removing structural arcs
		// GENERATOR NODES CONTAIN VALUE EDGES THAT MUST BE TRAVERSED ONLY IF THE GENERATOR NODE IS INCLUDED BY CONTROL
		if (currentNode.getType() == Node.Type.Generator && work.getPreviousEdgeType() != Edge.Type.Control)
@@ -140,4 +151,15 @@ public class ConstrainedAlgorithm implements SlicingAlgorithm

		return newWorks;
	}

	private boolean isArgumentOut(Node node) {
		if (node.getType() == Node.Type.Result
				&& edg.getNodeFromRes(node).getType() == Node.Type.Call) {
			List<Node> nodes = edg.getNodes(node, Direction.Backwards, Edge.Type.Value);
			for (Node n : nodes)
				if (n.equals(edg.getNodeFromRes(node)))
					return true;
		}
		return false;
	}
}
Loading