Loading src/main/java/tfm/Main.java +1 −1 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ public class Main { File file = new File("/home/jacosro/IdeaProjects/TFM/src/main/java/tfm/programs/Example2.java"); CompilationUnit compilationUnit = JavaParser.parse(file); Graph<?> graph = cfg(file, compilationUnit); Graph<?> graph = pdg(file, compilationUnit); System.out.println(graph); System.out.println(graph.toGraphvizRepresentation()); Loading src/main/java/tfm/graphs/PDGGraph.java +5 −4 Original line number Diff line number Diff line Loading @@ -51,11 +51,12 @@ public abstract class PDGGraph extends Graph<PDGVertex> { this.addArc(dataDataDependencyArc); } public Variable addNewVariable(String name, Vertex declarationNode) { Variable variable = new Variable(new VariableDeclaration(declarationNode), name); variableSet.addVariable(variable); public boolean containsVariable(String name) { return variableSet.containsVariable(name); } return variable; public Variable addNewVariable(String name, Vertex declarationNode) { return variableSet.addVariable(name, new VariableDeclaration(declarationNode)); } public void addVariableWrite(String variable, Vertex currentNode) { Loading src/main/java/tfm/utils/VariableExtractor.java +37 −15 Original line number Diff line number Diff line Loading @@ -4,19 +4,20 @@ import com.github.javaparser.ast.expr.*; import com.github.javaparser.ast.stmt.ExpressionStmt; import com.github.javaparser.ast.visitor.GenericVisitorAdapter; import com.github.javaparser.ast.visitor.VoidVisitorAdapter; import org.jetbrains.annotations.NotNull; import tfm.variables.Variable; import tfm.variables.VariableSet; import tfm.variables.actions.VariableAction.Actions; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.*; import java.util.function.BiConsumer; import java.util.stream.Collectors; public class VariableExtractor { public static class Result { public static class Result implements Iterable<Map.Entry<String, List<Actions>>> { public Map<String, List<Actions>> variableActions; private Map<String, List<Actions>> variableActions; public Result() { variableActions = new HashMap<>(); Loading @@ -31,14 +32,32 @@ public class VariableExtractor { variableActions.put(variable, actions); } } public Set<String> variableNames() { return variableActions.keySet(); } public Collection<List<Actions>> variableActions() { return variableActions.values(); } public void forEach(BiConsumer<String, List<Actions>> action) { variableActions.forEach(action); } @NotNull @Override public Iterator<Map.Entry<String, List<Actions>>> iterator() { return variableActions.entrySet().iterator(); } } private VariableExtractor() { } public static Result parse(Expression expression) { public static Result extractFrom(Expression expression) { VariableVisitor variableVisitor = new VariableVisitor(); expression.accept(variableVisitor, Actions.UNKNOWN); expression.accept(variableVisitor, Actions.READ); return variableVisitor.result; } Loading @@ -48,7 +67,7 @@ public class VariableExtractor { private Result result; private VariableVisitor() { result = new Result(); this.result = new Result(); } @Override Loading Loading @@ -80,7 +99,7 @@ public class VariableExtractor { @Override public void visit(ConditionalExpr n, Actions action) { System.out.println("On CondtionalExpr: [" + n + "]"); System.out.println("On ConditionalExpr: [" + n + "]"); n.getCondition().accept(this, action.or(Actions.READ)); n.getThenExpr().accept(this, action.or(Actions.READ)); n.getElseExpr().accept(this, action.or(Actions.READ)); Loading @@ -94,8 +113,8 @@ public class VariableExtractor { @Override public void visit(FieldAccessExpr n, Actions action) { // System.out.println("On FieldAccessExpr: [" + n + "]"); // n.getScope().accept(this, action.or(Actions.READ)); todo: accessing a field of a variable is a READ?? System.out.println("On FieldAccessExpr: [" + n + "]"); n.getScope().accept(this, action.or(Actions.READ)); } // @Override Loading @@ -107,14 +126,17 @@ public class VariableExtractor { @Override public void visit(MethodCallExpr n, Actions action) { System.out.println("On MethodCallExpr: [" + n + "]"); // n.getScope().ifPresent(expression -> expression.accept(this, action.or(Actions.READ))); todo: accessing a field of a variable is a READ?? n.getScope().ifPresent(expression -> expression.accept(this, action.or(Actions.READ))); n.getArguments().forEach(expression -> expression.accept(this, action.or(Actions.READ))); } @Override public void visit(NameExpr n, Actions action) { System.out.println("On NameExpr. Found variable " + n.getNameAsString() + " and action " + action); result.addVariableAction(n.getNameAsString(), action); String variableName = n.getNameAsString(); result.addVariableAction(variableName, action); } // @Override Loading @@ -139,7 +161,7 @@ public class VariableExtractor { System.out.println("On VariableDeclarationExpr: [" + n + "]"); n.getVariables() .forEach(variableDeclarator -> { variableDeclarator.getNameAsExpression().accept(this, action.or(Actions.WRITE)); variableDeclarator.getNameAsExpression().accept(this, action.or(Actions.DECLARE)); variableDeclarator.getInitializer() .ifPresent(expression -> expression.accept(this, action.or(Actions.READ))); }); Loading src/main/java/tfm/variables/Variable.java +6 −2 Original line number Diff line number Diff line package tfm.variables; import com.github.javaparser.ast.type.Type; import tfm.variables.actions.VariableDeclaration; import tfm.variables.actions.VariableRead; import tfm.variables.actions.VariableWrite; Loading @@ -15,7 +14,7 @@ public class Variable { private List<VariableWrite> writes; private List<VariableRead> reads; public Variable(VariableDeclaration variableDeclaration, String name) { Variable(String name, VariableDeclaration variableDeclaration) { this.declaration = variableDeclaration; this.name = name; this.writes = new ArrayList<>(); Loading Loading @@ -48,6 +47,11 @@ public class Variable { return name.equals(other.name) && declaration.equals(other.declaration); } @Override public int hashCode() { return name.hashCode() + declaration.hashCode(); } @Override public String toString() { return String.format("Variable %s declared on vertex %s", name, declaration.getNode().getId()); Loading src/main/java/tfm/variables/VariableSet.java +19 −15 Original line number Diff line number Diff line Loading @@ -31,13 +31,13 @@ public class VariableSet { return findVariableByName(name).isPresent(); } public void addVariable(Variable variable) { this.variableSet.add(variable); } public Optional<VariableWrite> getLastWriteOf(@NonNull String variableName) { Optional<Variable> variable = findVariableByName(variableName); if (!variable.isPresent()) return Optional.empty(); public Optional<VariableWrite> getLastWriteOf(@NonNull Variable variable) { List<VariableWrite> writes = variable.getWrites(); List<VariableWrite> writes = variable.get().getWrites(); if (writes.isEmpty()) return Optional.empty(); Loading @@ -45,15 +45,6 @@ public class VariableSet { return Optional.of(writes.get(writes.size() - 1)); } public Optional<VariableWrite> getLastWriteOf(@NonNull String variableName) { Optional<Variable> variable = findVariableByName(variableName); if (!variable.isPresent()) return Optional.empty(); return getLastWriteOf(variable.get()); } public void addRead(String variableName, VariableRead variableRead) { findVariableByName(variableName) .ifPresent(variable -> variable.addRead(variableRead)); Loading @@ -63,4 +54,17 @@ public class VariableSet { findVariableByName(variableName) .ifPresent(variable -> variable.addWrite(variableWrite)); } public Variable addVariable(String variableName, VariableDeclaration variableDeclaration) { Variable newVariable = new Variable(variableName, variableDeclaration); // check if it already exists if (this.variableSet.contains(newVariable)) { throw new IllegalStateException("Variable " + variableName + " already exists in VariableSet"); } this.variableSet.add(newVariable); return newVariable; } } Loading
src/main/java/tfm/Main.java +1 −1 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ public class Main { File file = new File("/home/jacosro/IdeaProjects/TFM/src/main/java/tfm/programs/Example2.java"); CompilationUnit compilationUnit = JavaParser.parse(file); Graph<?> graph = cfg(file, compilationUnit); Graph<?> graph = pdg(file, compilationUnit); System.out.println(graph); System.out.println(graph.toGraphvizRepresentation()); Loading
src/main/java/tfm/graphs/PDGGraph.java +5 −4 Original line number Diff line number Diff line Loading @@ -51,11 +51,12 @@ public abstract class PDGGraph extends Graph<PDGVertex> { this.addArc(dataDataDependencyArc); } public Variable addNewVariable(String name, Vertex declarationNode) { Variable variable = new Variable(new VariableDeclaration(declarationNode), name); variableSet.addVariable(variable); public boolean containsVariable(String name) { return variableSet.containsVariable(name); } return variable; public Variable addNewVariable(String name, Vertex declarationNode) { return variableSet.addVariable(name, new VariableDeclaration(declarationNode)); } public void addVariableWrite(String variable, Vertex currentNode) { Loading
src/main/java/tfm/utils/VariableExtractor.java +37 −15 Original line number Diff line number Diff line Loading @@ -4,19 +4,20 @@ import com.github.javaparser.ast.expr.*; import com.github.javaparser.ast.stmt.ExpressionStmt; import com.github.javaparser.ast.visitor.GenericVisitorAdapter; import com.github.javaparser.ast.visitor.VoidVisitorAdapter; import org.jetbrains.annotations.NotNull; import tfm.variables.Variable; import tfm.variables.VariableSet; import tfm.variables.actions.VariableAction.Actions; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.*; import java.util.function.BiConsumer; import java.util.stream.Collectors; public class VariableExtractor { public static class Result { public static class Result implements Iterable<Map.Entry<String, List<Actions>>> { public Map<String, List<Actions>> variableActions; private Map<String, List<Actions>> variableActions; public Result() { variableActions = new HashMap<>(); Loading @@ -31,14 +32,32 @@ public class VariableExtractor { variableActions.put(variable, actions); } } public Set<String> variableNames() { return variableActions.keySet(); } public Collection<List<Actions>> variableActions() { return variableActions.values(); } public void forEach(BiConsumer<String, List<Actions>> action) { variableActions.forEach(action); } @NotNull @Override public Iterator<Map.Entry<String, List<Actions>>> iterator() { return variableActions.entrySet().iterator(); } } private VariableExtractor() { } public static Result parse(Expression expression) { public static Result extractFrom(Expression expression) { VariableVisitor variableVisitor = new VariableVisitor(); expression.accept(variableVisitor, Actions.UNKNOWN); expression.accept(variableVisitor, Actions.READ); return variableVisitor.result; } Loading @@ -48,7 +67,7 @@ public class VariableExtractor { private Result result; private VariableVisitor() { result = new Result(); this.result = new Result(); } @Override Loading Loading @@ -80,7 +99,7 @@ public class VariableExtractor { @Override public void visit(ConditionalExpr n, Actions action) { System.out.println("On CondtionalExpr: [" + n + "]"); System.out.println("On ConditionalExpr: [" + n + "]"); n.getCondition().accept(this, action.or(Actions.READ)); n.getThenExpr().accept(this, action.or(Actions.READ)); n.getElseExpr().accept(this, action.or(Actions.READ)); Loading @@ -94,8 +113,8 @@ public class VariableExtractor { @Override public void visit(FieldAccessExpr n, Actions action) { // System.out.println("On FieldAccessExpr: [" + n + "]"); // n.getScope().accept(this, action.or(Actions.READ)); todo: accessing a field of a variable is a READ?? System.out.println("On FieldAccessExpr: [" + n + "]"); n.getScope().accept(this, action.or(Actions.READ)); } // @Override Loading @@ -107,14 +126,17 @@ public class VariableExtractor { @Override public void visit(MethodCallExpr n, Actions action) { System.out.println("On MethodCallExpr: [" + n + "]"); // n.getScope().ifPresent(expression -> expression.accept(this, action.or(Actions.READ))); todo: accessing a field of a variable is a READ?? n.getScope().ifPresent(expression -> expression.accept(this, action.or(Actions.READ))); n.getArguments().forEach(expression -> expression.accept(this, action.or(Actions.READ))); } @Override public void visit(NameExpr n, Actions action) { System.out.println("On NameExpr. Found variable " + n.getNameAsString() + " and action " + action); result.addVariableAction(n.getNameAsString(), action); String variableName = n.getNameAsString(); result.addVariableAction(variableName, action); } // @Override Loading @@ -139,7 +161,7 @@ public class VariableExtractor { System.out.println("On VariableDeclarationExpr: [" + n + "]"); n.getVariables() .forEach(variableDeclarator -> { variableDeclarator.getNameAsExpression().accept(this, action.or(Actions.WRITE)); variableDeclarator.getNameAsExpression().accept(this, action.or(Actions.DECLARE)); variableDeclarator.getInitializer() .ifPresent(expression -> expression.accept(this, action.or(Actions.READ))); }); Loading
src/main/java/tfm/variables/Variable.java +6 −2 Original line number Diff line number Diff line package tfm.variables; import com.github.javaparser.ast.type.Type; import tfm.variables.actions.VariableDeclaration; import tfm.variables.actions.VariableRead; import tfm.variables.actions.VariableWrite; Loading @@ -15,7 +14,7 @@ public class Variable { private List<VariableWrite> writes; private List<VariableRead> reads; public Variable(VariableDeclaration variableDeclaration, String name) { Variable(String name, VariableDeclaration variableDeclaration) { this.declaration = variableDeclaration; this.name = name; this.writes = new ArrayList<>(); Loading Loading @@ -48,6 +47,11 @@ public class Variable { return name.equals(other.name) && declaration.equals(other.declaration); } @Override public int hashCode() { return name.hashCode() + declaration.hashCode(); } @Override public String toString() { return String.format("Variable %s declared on vertex %s", name, declaration.getNode().getId()); Loading
src/main/java/tfm/variables/VariableSet.java +19 −15 Original line number Diff line number Diff line Loading @@ -31,13 +31,13 @@ public class VariableSet { return findVariableByName(name).isPresent(); } public void addVariable(Variable variable) { this.variableSet.add(variable); } public Optional<VariableWrite> getLastWriteOf(@NonNull String variableName) { Optional<Variable> variable = findVariableByName(variableName); if (!variable.isPresent()) return Optional.empty(); public Optional<VariableWrite> getLastWriteOf(@NonNull Variable variable) { List<VariableWrite> writes = variable.getWrites(); List<VariableWrite> writes = variable.get().getWrites(); if (writes.isEmpty()) return Optional.empty(); Loading @@ -45,15 +45,6 @@ public class VariableSet { return Optional.of(writes.get(writes.size() - 1)); } public Optional<VariableWrite> getLastWriteOf(@NonNull String variableName) { Optional<Variable> variable = findVariableByName(variableName); if (!variable.isPresent()) return Optional.empty(); return getLastWriteOf(variable.get()); } public void addRead(String variableName, VariableRead variableRead) { findVariableByName(variableName) .ifPresent(variable -> variable.addRead(variableRead)); Loading @@ -63,4 +54,17 @@ public class VariableSet { findVariableByName(variableName) .ifPresent(variable -> variable.addWrite(variableWrite)); } public Variable addVariable(String variableName, VariableDeclaration variableDeclaration) { Variable newVariable = new Variable(variableName, variableDeclaration); // check if it already exists if (this.variableSet.contains(newVariable)) { throw new IllegalStateException("Variable " + variableName + " already exists in VariableSet"); } this.variableSet.add(newVariable); return newVariable; } }