Loading src/main/java/tfm/graphlib/Main.java +1 −1 Original line number Diff line number Diff line Loading @@ -38,6 +38,6 @@ public class Main { // compilationUnit.accept(new PDGVisitor(pdgGraph), pdgGraph.getRootVertex()); System.out.println(pdgGraph); // System.out.println(cfgGraph.toGraphvizRepresentation()); System.out.println(pdgGraph.toGraphvizRepresentation()); } } src/main/java/tfm/graphlib/arcs/Arc.java +6 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,11 @@ public abstract class Arc<D extends ArcData> extends edg.graphlib.Arrow<String, } public String toGraphvizRepresentation() { return String.format("\"%s\" -> \"%s\"", getFrom().getData(), getTo().getData()); Vertex from = (Vertex) getFrom(); Vertex to = (Vertex) getTo(); return String.format("\"%s: %s\" -> \"%s: %s\"", from.getId(), from.getData(), to.getId(), to.getData()); } } src/main/java/tfm/graphlib/nodes/Vertex.java +17 −0 Original line number Diff line number Diff line Loading @@ -3,12 +3,21 @@ package tfm.graphlib.nodes; import tfm.graphlib.arcs.data.ArcData; import tfm.graphlib.graphs.Graph; import java.util.Optional; import java.util.stream.Collectors; public class Vertex extends edg.graphlib.Vertex<String, ArcData> { private int fileLineNumber; public Vertex(Graph.VertexId id, String instruction) { this(id, instruction, null); } public Vertex(Graph.VertexId id, String instruction, Integer fileLineNumber) { super(id.toString(), instruction); this.fileLineNumber = Optional.ofNullable(fileLineNumber).orElse(-1); } public int getId() { Loading @@ -22,4 +31,12 @@ public class Vertex extends edg.graphlib.Vertex<String, ArcData> { getIncomingArrows().stream().map(arrow -> arrow.getFrom().getName()).collect(Collectors.toList()), getOutgoingArrows().stream().map(arc -> arc.getTo().getName()).collect(Collectors.toList())); } public Optional<Integer> getFileLineNumber() { return fileLineNumber == -1 ? Optional.empty() : Optional.of(fileLineNumber); } public void setFileLineNumber(Integer fileLineNumber) { this.fileLineNumber = fileLineNumber; } } src/main/java/tfm/graphlib/utils/VariableExtractor.java +22 −11 Original line number Diff line number Diff line package tfm.graphlib.utils; import com.github.javaparser.ast.expr.AssignExpr; import com.github.javaparser.ast.expr.Expression; import com.github.javaparser.ast.expr.VariableDeclarationExpr; import com.github.javaparser.ast.stmt.ExpressionStmt; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class VariableExtractor { private List<String> declaredVariables; private Map<String, Object> declaredVariables; private List<String> usedVariables; private VariableExtractor() { declaredVariables = new ArrayList<>(); declaredVariables = new HashMap<>(); usedVariables = new ArrayList<>(); } public static VariableExtractor parse(Expression expression) { VariableExtractor extractor = new VariableExtractor(); extractor.parse(expression); // public static VariableExtractor parse(Expression expression) { // VariableExtractor extractor = new VariableExtractor(); // // return extractor; // } return extractor; } public static VariableExtractor parse(AssignExpr assignExpr) { VariableExtractor variableExtractor = new VariableExtractor(); assignExpr.getTarget().ifVariableDeclarationExpr(variableDeclarationExpr -> variableDeclarationExpr.getVariables().forEach(variableDeclarator -> { private void parse(AssignExpr assignExpr) { }) ); return variableExtractor; } private void parse(VariableDeclarationExpr variableDeclarationExpr) { public static VariableExtractor parse(VariableDeclarationExpr variableDeclarationExpr) { VariableExtractor variableExtractor = new VariableExtractor(); // todo return variableExtractor; } } src/main/java/tfm/graphlib/visitors/PDGVisitor.java +29 −0 Original line number Diff line number Diff line package tfm.graphlib.visitors; import com.github.javaparser.ast.expr.AssignExpr; import com.github.javaparser.ast.expr.BooleanLiteralExpr; import com.github.javaparser.ast.expr.Expression; import com.github.javaparser.ast.expr.StringLiteralExpr; import com.github.javaparser.ast.stmt.ExpressionStmt; import com.github.javaparser.ast.stmt.ForStmt; import com.github.javaparser.ast.stmt.IfStmt; import com.github.javaparser.ast.stmt.WhileStmt; import com.github.javaparser.ast.visitor.VoidVisitorAdapter; import tfm.graphlib.graphs.PDGGraph; import tfm.graphlib.nodes.PDGVertex; import java.util.List; import java.util.stream.Collectors; public class PDGVisitor extends VoidVisitorAdapter<PDGVertex> { private PDGGraph graph; Loading Loading @@ -50,4 +57,26 @@ public class PDGVisitor extends VoidVisitorAdapter<PDGVertex> { super.visit(whileStmt, whileNode); } @Override public void visit(ForStmt forStmt, PDGVertex parent) { // Add initialization nodes forStmt.getInitialization().stream() .map(expression -> graph.addVertex(expression.toString())) .forEach(pdgVertex -> graph.addControlDependencyArc(parent, pdgVertex)); // Add condition node Expression condition = forStmt.getCompare().orElse(new BooleanLiteralExpr(true)); PDGVertex conditionNode = graph.addVertex(condition.toString()); graph.addControlDependencyArc(parent, conditionNode); // Visit for super.visit(forStmt, conditionNode); // Add update vertex forStmt.getUpdate().stream() .map(expression -> graph.addVertex(expression.toString())) .forEach(pdgVertex -> graph.addControlDependencyArc(conditionNode, pdgVertex)); } } Loading
src/main/java/tfm/graphlib/Main.java +1 −1 Original line number Diff line number Diff line Loading @@ -38,6 +38,6 @@ public class Main { // compilationUnit.accept(new PDGVisitor(pdgGraph), pdgGraph.getRootVertex()); System.out.println(pdgGraph); // System.out.println(cfgGraph.toGraphvizRepresentation()); System.out.println(pdgGraph.toGraphvizRepresentation()); } }
src/main/java/tfm/graphlib/arcs/Arc.java +6 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,11 @@ public abstract class Arc<D extends ArcData> extends edg.graphlib.Arrow<String, } public String toGraphvizRepresentation() { return String.format("\"%s\" -> \"%s\"", getFrom().getData(), getTo().getData()); Vertex from = (Vertex) getFrom(); Vertex to = (Vertex) getTo(); return String.format("\"%s: %s\" -> \"%s: %s\"", from.getId(), from.getData(), to.getId(), to.getData()); } }
src/main/java/tfm/graphlib/nodes/Vertex.java +17 −0 Original line number Diff line number Diff line Loading @@ -3,12 +3,21 @@ package tfm.graphlib.nodes; import tfm.graphlib.arcs.data.ArcData; import tfm.graphlib.graphs.Graph; import java.util.Optional; import java.util.stream.Collectors; public class Vertex extends edg.graphlib.Vertex<String, ArcData> { private int fileLineNumber; public Vertex(Graph.VertexId id, String instruction) { this(id, instruction, null); } public Vertex(Graph.VertexId id, String instruction, Integer fileLineNumber) { super(id.toString(), instruction); this.fileLineNumber = Optional.ofNullable(fileLineNumber).orElse(-1); } public int getId() { Loading @@ -22,4 +31,12 @@ public class Vertex extends edg.graphlib.Vertex<String, ArcData> { getIncomingArrows().stream().map(arrow -> arrow.getFrom().getName()).collect(Collectors.toList()), getOutgoingArrows().stream().map(arc -> arc.getTo().getName()).collect(Collectors.toList())); } public Optional<Integer> getFileLineNumber() { return fileLineNumber == -1 ? Optional.empty() : Optional.of(fileLineNumber); } public void setFileLineNumber(Integer fileLineNumber) { this.fileLineNumber = fileLineNumber; } }
src/main/java/tfm/graphlib/utils/VariableExtractor.java +22 −11 Original line number Diff line number Diff line package tfm.graphlib.utils; import com.github.javaparser.ast.expr.AssignExpr; import com.github.javaparser.ast.expr.Expression; import com.github.javaparser.ast.expr.VariableDeclarationExpr; import com.github.javaparser.ast.stmt.ExpressionStmt; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class VariableExtractor { private List<String> declaredVariables; private Map<String, Object> declaredVariables; private List<String> usedVariables; private VariableExtractor() { declaredVariables = new ArrayList<>(); declaredVariables = new HashMap<>(); usedVariables = new ArrayList<>(); } public static VariableExtractor parse(Expression expression) { VariableExtractor extractor = new VariableExtractor(); extractor.parse(expression); // public static VariableExtractor parse(Expression expression) { // VariableExtractor extractor = new VariableExtractor(); // // return extractor; // } return extractor; } public static VariableExtractor parse(AssignExpr assignExpr) { VariableExtractor variableExtractor = new VariableExtractor(); assignExpr.getTarget().ifVariableDeclarationExpr(variableDeclarationExpr -> variableDeclarationExpr.getVariables().forEach(variableDeclarator -> { private void parse(AssignExpr assignExpr) { }) ); return variableExtractor; } private void parse(VariableDeclarationExpr variableDeclarationExpr) { public static VariableExtractor parse(VariableDeclarationExpr variableDeclarationExpr) { VariableExtractor variableExtractor = new VariableExtractor(); // todo return variableExtractor; } }
src/main/java/tfm/graphlib/visitors/PDGVisitor.java +29 −0 Original line number Diff line number Diff line package tfm.graphlib.visitors; import com.github.javaparser.ast.expr.AssignExpr; import com.github.javaparser.ast.expr.BooleanLiteralExpr; import com.github.javaparser.ast.expr.Expression; import com.github.javaparser.ast.expr.StringLiteralExpr; import com.github.javaparser.ast.stmt.ExpressionStmt; import com.github.javaparser.ast.stmt.ForStmt; import com.github.javaparser.ast.stmt.IfStmt; import com.github.javaparser.ast.stmt.WhileStmt; import com.github.javaparser.ast.visitor.VoidVisitorAdapter; import tfm.graphlib.graphs.PDGGraph; import tfm.graphlib.nodes.PDGVertex; import java.util.List; import java.util.stream.Collectors; public class PDGVisitor extends VoidVisitorAdapter<PDGVertex> { private PDGGraph graph; Loading Loading @@ -50,4 +57,26 @@ public class PDGVisitor extends VoidVisitorAdapter<PDGVertex> { super.visit(whileStmt, whileNode); } @Override public void visit(ForStmt forStmt, PDGVertex parent) { // Add initialization nodes forStmt.getInitialization().stream() .map(expression -> graph.addVertex(expression.toString())) .forEach(pdgVertex -> graph.addControlDependencyArc(parent, pdgVertex)); // Add condition node Expression condition = forStmt.getCompare().orElse(new BooleanLiteralExpr(true)); PDGVertex conditionNode = graph.addVertex(condition.toString()); graph.addControlDependencyArc(parent, conditionNode); // Visit for super.visit(forStmt, conditionNode); // Add update vertex forStmt.getUpdate().stream() .map(expression -> graph.addVertex(expression.toString())) .forEach(pdgVertex -> graph.addControlDependencyArc(conditionNode, pdgVertex)); } }