Commit 7deec96a authored by Carlos Galindo's avatar Carlos Galindo
Browse files

Slicing: representation and transformation to code.

parent 0e6acf90
Loading
Loading
Loading
Loading
+35 −5
Original line number Diff line number Diff line
package tfm.exec;

import guru.nidi.graphviz.engine.Format;
import tfm.graphs.CFG;
import tfm.graphs.CFG.ACFG;
import tfm.graphs.CFG.ECFG;
import tfm.graphs.PDG;
import tfm.graphs.PDG.APDG;
import tfm.graphs.PDG.EPDG;
import tfm.graphs.PDG.EPPDG;
import tfm.graphs.PDG.PPDG;
import tfm.nodes.GraphNode;
import tfm.utils.Logger;
@@ -13,7 +18,7 @@ import java.util.Comparator;
import java.util.stream.Collectors;

public class PDGLog extends GraphLog<PDG> {
    public static final int PDG = 0, APDG = 1, PPDG = 2;
    public static final int PDG = 0, APDG = 1, PPDG = 2, EPDG = 3, EPPDG = 4;

    private CFGLog cfgLog;
    private int type;
@@ -36,18 +41,29 @@ public class PDGLog extends GraphLog<PDG> {
        switch (type) {
            case PDG:
                this.graph = new PDG();
                this.graph.setCfg(new CFG());
                break;
            case APDG:
                this.graph = new APDG();
                this.graph.setCfg(new ACFG());
                break;
            case PPDG:
                this.graph = new PPDG();
                this.graph.setCfg(new ACFG());
                break;
            case EPDG:
                this.graph = new EPDG();
                this.graph.setCfg(new ECFG());
                break;
            case EPPDG:
                this.graph = new EPPDG();
                this.graph.setCfg(new ECFG());
                break;
            default:
                throw new RuntimeException("Invalid type of PDG");
        }

        node.accept(new PDGBuilder(graph), this.graph.getRootNode());
        node.accept(new PDGBuilder(graph, graph.getCfg()), this.graph.getRootNode());

        if (cfgLog == null) {
            cfgLog = new CFGLog(graph.getCfg());
@@ -75,17 +91,31 @@ public class PDGLog extends GraphLog<PDG> {
    public void generateImages(String imageName, Format format) throws IOException {
        super.generateImages(imageName + "-" + getExtra(), format);
        if (cfgLog != null)
            cfgLog.generateImages(imageName + "-cfg", format);
            cfgLog.generateImages(imageName + "-" + getExtraCFG(), format);
    }

    private String getExtraCFG() {
        if (graph.getCfg() instanceof ECFG)
            return "ecfg";
        else if (graph.getCfg() instanceof ACFG)
            return "acfg";
        else if (graph.getCfg() instanceof CFG)
            return "cfg";
        throw new RuntimeException("invalid or null cfg graph type");
    }

    private String getExtra() {
        if (graph instanceof PPDG)
        if (graph instanceof EPPDG)
            return "eppdg";
        else if (graph instanceof EPDG)
            return "epdg";
        else if (graph instanceof PPDG)
            return "ppdg";
        else if (graph instanceof APDG)
            return "apdg";
        else if (graph instanceof PDG)
            return "pdg";
        throw new RuntimeException("invalid or null graph type");
        throw new RuntimeException("invalid or null pdg graph type");
    }

    @Override
+0 −5
Original line number Diff line number Diff line
@@ -75,11 +75,6 @@ public class CFG extends Graph {
                "}";
    }

    @Override
    public Set<Integer> slice(SlicingCriterion slicingCriterion) {
        throw new RuntimeException("Can't slice a CFG!");
    }

    public Set<GraphNode<?>> findLastDefinitionsFrom(GraphNode<?> startNode, String variable) {
        if (!this.contains(startNode)) {
            throw new NodeNotFoundException(startNode, this);
+0 −2
Original line number Diff line number Diff line
@@ -133,8 +133,6 @@ public abstract class Graph extends edg.graphlib.Graph<String, ArcData> {
                .anyMatch(node -> Objects.equals(node, graphNode));
    }

    public abstract Set<Integer> slice(SlicingCriterion slicingCriterion);

    /**
     * Deprecated for incorrect behaviour. Use removeNode instead
     */
+19 −18
Original line number Diff line number Diff line
@@ -10,12 +10,13 @@ import tfm.arcs.pdg.ControlDependencyArc;
import tfm.arcs.pdg.DataDependencyArc;
import tfm.graphs.CFG.ACFG;
import tfm.nodes.GraphNode;
import tfm.slicing.Slice;
import tfm.slicing.Sliceable;
import tfm.slicing.SlicingCriterion;
import tfm.utils.ASTUtils;
import tfm.utils.NodeNotFoundException;

import java.util.Comparator;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
@@ -27,7 +28,7 @@ import java.util.stream.Collectors;
 * the {@link tfm.visitors.pdg.PDGBuilder PDGBuilder}.
 * The variations of the PDG are represented as child types.
 */
public class PDG extends Graph {
public class PDG extends Graph implements Sliceable {
    public static boolean isRanked = false, isSorted = false;

    private CFG cfg;
@@ -171,25 +172,25 @@ public class PDG extends Graph {
    }

    @Override
    public Set<Integer> slice(SlicingCriterion slicingCriterion) {
    public Slice slice(SlicingCriterion slicingCriterion) {
        Optional<GraphNode<?>> node = slicingCriterion.findNode(this);
        if (!node.isPresent())
            throw new NodeNotFoundException(slicingCriterion);
        Set<Integer> visited = new HashSet<>();
        getSliceNodes(visited, node.get());
        return visited;
        Slice slice = new Slice();
        getSliceNodes(slice, node.get());
        return slice;
    }

    protected void getSliceNodes(Set<Integer> visited, GraphNode<?> node) {
        visited.add(node.getId());
    protected void getSliceNodes(Slice slice, GraphNode<?> node) {
        slice.add(node);

        for (Arc<ArcData> arc : node.getIncomingArcs()) {
            GraphNode<?> from = arc.getFromNode();

            if (visited.contains(from.getId()))
            if (slice.contains(from))
                continue;

            getSliceNodes(visited, from);
            getSliceNodes(slice, from);
        }
    }

@@ -217,21 +218,21 @@ public class PDG extends Graph {
        }

        @Override
        protected void getSliceNodes(Set<Integer> visited, GraphNode<?> node) {
            visited.add(node.getId());
        protected void getSliceNodes(Slice slice, GraphNode<?> node) {
            slice.add(node);

            for (Arc<ArcData> arc : node.getIncomingArcs()) {
                GraphNode<?> from = arc.getFromNode();

                if (visited.contains(from.getId()))
                if (slice.contains(from))
                    continue;

                getSliceNodesPPDG(visited, from);
                getSliceNodesPPDG(slice, from);
            }
        }

        protected void getSliceNodesPPDG(Set<Integer> visited, GraphNode<?> node) {
            visited.add(node.getId());
        protected void getSliceNodesPPDG(Slice slice, GraphNode<?> node) {
            slice.add(node);

            if (ASTUtils.isPseudoPredicate(node.getAstNode()))
                return;
@@ -239,10 +240,10 @@ public class PDG extends Graph {
            for (Arc<ArcData> arc : node.getIncomingArcs()) {
                GraphNode<?> from = arc.getFromNode();

                if (visited.contains(from.getId()))
                if (slice.contains(from))
                    continue;

                getSliceNodesPPDG(visited, from);
                getSliceNodesPPDG(slice, from);
            }
        }
    }
+4 −2
Original line number Diff line number Diff line
@@ -5,13 +5,15 @@ import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.ast.body.Parameter;
import com.github.javaparser.ast.stmt.EmptyStmt;
import tfm.nodes.GraphNode;
import tfm.slicing.Slice;
import tfm.slicing.Sliceable;
import tfm.slicing.SlicingCriterion;
import tfm.utils.Context;

import java.util.*;
import java.util.stream.Collectors;

public class SDG extends Graph {
public class SDG extends Graph implements Sliceable {

    private Map<Context, PDG> contextPDGGraphMap;

@@ -34,7 +36,7 @@ public class SDG extends Graph {
    }

    @Override
    public Set<Integer> slice(SlicingCriterion slicingCriterion) {
    public Slice slice(SlicingCriterion slicingCriterion) {
        throw new RuntimeException("Slicing not implemented for the SDG");
    }

Loading