Commit 079ecc49 authored by Carlos Galindo's avatar Carlos Galindo
Browse files

SlicingCriterion can select several nodes from the graph instead of a single one.

parent 00f16679
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -10,7 +10,6 @@ import es.upv.mist.slicing.graphs.cfg.CFG;
import es.upv.mist.slicing.graphs.exceptionsensitive.ESSDG;
import es.upv.mist.slicing.graphs.sdg.SDG;
import es.upv.mist.slicing.slicing.FileLineSlicingCriterion;
import es.upv.mist.slicing.slicing.NodeIdSlicingCriterion;
import es.upv.mist.slicing.slicing.Slice;
import es.upv.mist.slicing.slicing.SlicingCriterion;
import es.upv.mist.slicing.utils.StaticTypeSolver;
@@ -20,6 +19,7 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Set;

public class PHPSlice {
    protected static final Options OPTIONS = new Options();
@@ -108,7 +108,7 @@ public class PHPSlice {
        }
        sdg.build(units);

        SlicingCriterion sc = new NodeIdSlicingCriterion(0, "");
        SlicingCriterion sc = graph -> Set.of(graph.findNodeById(0).orElseThrow());
        Slice slice = new Slice();
        if (scId != 0) {
            // Slice the SDG
+10 −4
Original line number Diff line number Diff line
@@ -11,11 +11,13 @@ import org.jgrapht.nio.dot.DOTExporter;

import java.util.HashMap;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;

/** Utility to export a sliced SDG in dot and show the slices and slicing criterion. */
public class SlicedSDGLog extends SDGLog {
    protected final Slice slice;
    protected final GraphNode<?> sc;
    protected final Set<GraphNode<?>> sc;

    public SlicedSDGLog(SDG graph, Slice slice) {
        this(graph, slice, null);
@@ -24,7 +26,11 @@ public class SlicedSDGLog extends SDGLog {
    public SlicedSDGLog(SDG graph, Slice slice, SlicingCriterion sc) {
        super(graph);
        this.slice = slice;
        this.sc = sc == null ? null : sc.findNode(graph).orElse(null);
        Set<GraphNode<?>> set = null;
        try {
            set = sc.findNode(graph);
        } catch (NullPointerException | NoSuchElementException ignored) {}
        this.sc = set;
    }

    @Override
@@ -38,13 +44,13 @@ public class SlicedSDGLog extends SDGLog {

    protected Map<String, Attribute> vertexAttributes(GraphNode<?> node) {
        Map<String, Attribute> map = new HashMap<>();
        if (slice.contains(node) && node.equals(sc))
        if (slice.contains(node) && sc.contains(node))
            map.put("style", DefaultAttribute.createAttribute("filled,bold"));
        else if (slice.contains(node) && node.isImplicitInstruction())
            map.put("style", DefaultAttribute.createAttribute("filled,dashed"));
        else if (slice.contains(node))
            map.put("style", DefaultAttribute.createAttribute("filled"));
        else if (node.equals(sc))
        else if (sc.contains(node))
            map.put("style", DefaultAttribute.createAttribute("bold"));
        else if (node.isImplicitInstruction())
            map.put("style", DefaultAttribute.createAttribute("dashed"));
+9 −5
Original line number Diff line number Diff line
@@ -26,7 +26,8 @@ import es.upv.mist.slicing.utils.ASTUtils;

import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.NoSuchElementException;
import java.util.Set;

/**
 * The <b>System Dependence Graph</b> represents the statements of a program in
@@ -53,10 +54,13 @@ public class SDG extends Graph implements Sliceable, Buildable<NodeList<Compilat

    @Override
    public Slice slice(SlicingCriterion slicingCriterion) {
        Optional<GraphNode<?>> optSlicingNode = slicingCriterion.findNode(this);
        if (optSlicingNode.isEmpty())
            throw new IllegalArgumentException("Could not locate the slicing criterion in the SDG");
        return createSlicingAlgorithm().traverse(optSlicingNode.get());
        Set<GraphNode<?>> slicingCriterionNodes;
        try {
            slicingCriterionNodes = slicingCriterion.findNode(this);
        } catch (NoSuchElementException e) {
            throw new IllegalArgumentException("Could not locate the slicing criterion " + slicingCriterion);
        }
        return createSlicingAlgorithm().traverse(slicingCriterionNodes);
    }

    protected SlicingAlgorithm createSlicingAlgorithm() {
+2 −2
Original line number Diff line number Diff line
@@ -29,9 +29,9 @@ public class ClassicSlicingAlgorithm implements SlicingAlgorithm {
    }

    @Override
    public Slice traverse(GraphNode<?> slicingCriterion) {
    public Slice traverse(Set<GraphNode<?>> slicingCriterion) {
        Slice slice = new Slice();
        slice.add(slicingCriterion);
        slice.addAll(slicingCriterion);
        pass(slice, this::ignorePass1);
        pass(slice, this::ignorePass2);
        return slice;
+5 −5
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ public class ExceptionSensitiveSlicingAlgorithm implements SlicingAlgorithm {
    protected static final Predicate<Arc> SDG_PASS_2 = Arc::isInterproceduralInputArc;

    protected final ESSDG graph;
    protected GraphNode<?> slicingCriterion;
    protected Set<GraphNode<?>> slicingCriterion;

    /** Set of the arcs that have been traversed in the slicing process. */
    protected final Set<Arc> traversedArcSet = new HashSet<>();
@@ -47,10 +47,10 @@ public class ExceptionSensitiveSlicingAlgorithm implements SlicingAlgorithm {
    }

    @Override
    public Slice traverse(GraphNode<?> slicingCriterion) {
    public Slice traverse(Set<GraphNode<?>> slicingCriterion) {
        this.slicingCriterion = slicingCriterion;
        Slice slice = new Slice();
        slice.add(slicingCriterion);
        slice.addAll(slicingCriterion);
        pass(slice, SDG_PASS_1.or(this::commonIgnoreConditions));
        pass(slice, SDG_PASS_2.or(this::commonIgnoreConditions));
        return slice;
@@ -58,7 +58,7 @@ public class ExceptionSensitiveSlicingAlgorithm implements SlicingAlgorithm {

    @Override
    public Slice traverseProcedure(GraphNode<?> slicingCriterion) {
        this.slicingCriterion = slicingCriterion;
        this.slicingCriterion = Set.of(slicingCriterion);
        Slice slice = new Slice();
        slice.add(slicingCriterion);
        pass(slice, INTRAPROCEDURAL);
@@ -121,7 +121,7 @@ public class ExceptionSensitiveSlicingAlgorithm implements SlicingAlgorithm {
        return arc.isUnconditionalControlDependencyArc() &&
                graph.isPseudoPredicate(target) &&
                reachedStream(target).allMatch(Arc::isUnconditionalControlDependencyArc) &&
                !target.equals(slicingCriterion);
                !slicingCriterion.contains(target);
    }

    /** Applies rule 4 of the algorithm. */
Loading