Loading src/main/java/tfm/exec/PDGLog.java +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; Loading @@ -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; Loading @@ -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()); Loading Loading @@ -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 Loading src/main/java/tfm/graphs/CFG.java +0 −5 Original line number Diff line number Diff line Loading @@ -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); Loading src/main/java/tfm/graphs/Graph.java +0 −2 Original line number Diff line number Diff line Loading @@ -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 */ Loading src/main/java/tfm/graphs/PDG.java +19 −18 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); } } Loading Loading @@ -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; Loading @@ -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); } } } Loading src/main/java/tfm/graphs/SDG.java +4 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading
src/main/java/tfm/exec/PDGLog.java +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; Loading @@ -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; Loading @@ -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()); Loading Loading @@ -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 Loading
src/main/java/tfm/graphs/CFG.java +0 −5 Original line number Diff line number Diff line Loading @@ -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); Loading
src/main/java/tfm/graphs/Graph.java +0 −2 Original line number Diff line number Diff line Loading @@ -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 */ Loading
src/main/java/tfm/graphs/PDG.java +19 −18 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); } } Loading Loading @@ -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; Loading @@ -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); } } } Loading
src/main/java/tfm/graphs/SDG.java +4 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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