Loading sdg-cli/src/main/java/es/upv/mist/slicing/cli/PHPSlice.java +2 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading Loading @@ -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 Loading sdg-cli/src/main/java/es/upv/mist/slicing/cli/SlicedSDGLog.java +10 −4 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 Loading @@ -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")); Loading sdg-core/src/main/java/es/upv/mist/slicing/graphs/sdg/SDG.java +9 −5 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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() { Loading sdg-core/src/main/java/es/upv/mist/slicing/slicing/ClassicSlicingAlgorithm.java +2 −2 Original line number Diff line number Diff line Loading @@ -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; Loading sdg-core/src/main/java/es/upv/mist/slicing/slicing/ExceptionSensitiveSlicingAlgorithm.java +5 −5 Original line number Diff line number Diff line Loading @@ -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<>(); Loading @@ -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; Loading @@ -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); Loading Loading @@ -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 Loading
sdg-cli/src/main/java/es/upv/mist/slicing/cli/PHPSlice.java +2 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading Loading @@ -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 Loading
sdg-cli/src/main/java/es/upv/mist/slicing/cli/SlicedSDGLog.java +10 −4 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 Loading @@ -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")); Loading
sdg-core/src/main/java/es/upv/mist/slicing/graphs/sdg/SDG.java +9 −5 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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() { Loading
sdg-core/src/main/java/es/upv/mist/slicing/slicing/ClassicSlicingAlgorithm.java +2 −2 Original line number Diff line number Diff line Loading @@ -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; Loading
sdg-core/src/main/java/es/upv/mist/slicing/slicing/ExceptionSensitiveSlicingAlgorithm.java +5 −5 Original line number Diff line number Diff line Loading @@ -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<>(); Loading @@ -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; Loading @@ -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); Loading Loading @@ -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