Commit ffc7d398 authored by Carlos Galindo's avatar Carlos Galindo
Browse files

Link ObjectTreeConnections with value dependencies when the target is primitive/has no tree.

parent 24628c1b
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
import com.github.javaparser.resolution.UnsolvedSymbolException;
import com.github.javaparser.resolution.declarations.ResolvedClassDeclaration;
import com.github.javaparser.resolution.types.ResolvedReferenceType;
import com.github.javaparser.resolution.types.ResolvedType;
import es.upv.mist.slicing.arcs.Arc;
import es.upv.mist.slicing.nodes.ObjectTree;
import es.upv.mist.slicing.utils.ASTUtils;
@@ -145,6 +146,15 @@ public class ClassGraph extends DirectedPseudograph<ClassGraph.Vertex, ClassGrap
        }
    }

    public Optional<ObjectTree> generateObjectTreeForType(ResolvedType type) {
        if (type.isReferenceType()) {
            Vertex v = vertexDeclarationMap.get(mapKey(type.asReferenceType()));
            if (v != null)
                return Optional.of(generateObjectTreeFor(v));
        }
        return Optional.empty();
    }

    public ObjectTree generateObjectTreeFor(ClassOrInterfaceDeclaration declaration) {
        return generateObjectTreeFor(vertexDeclarationMap.get(mapKey(declaration)));
    }
+10 −8
Original line number Diff line number Diff line
@@ -6,7 +6,6 @@ import com.github.javaparser.ast.expr.*;
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
import com.github.javaparser.resolution.Resolvable;
import com.github.javaparser.resolution.declarations.ResolvedMethodLikeDeclaration;
import com.github.javaparser.resolution.types.ResolvedReferenceType;
import com.github.javaparser.utils.Pair;
import es.upv.mist.slicing.nodes.GraphNode;
import es.upv.mist.slicing.nodes.ObjectTree;
@@ -29,9 +28,8 @@ public class ExpressionObjectTreeFinder {
    public void handleVariableDeclarator(VariableDeclarator variableDeclarator) {
        assert variableDeclarator.getInitializer().isPresent();
        VariableAction targetAction = locateVAVariableDeclarator(variableDeclarator.getNameAsString());
        ResolvedReferenceType type = variableDeclarator.getType().resolve().asReferenceType();
        var fields = ClassGraph.getInstance().generateObjectTreeFor(type);
        targetAction.getObjectTree().addAll(fields);
        ClassGraph.getInstance().generateObjectTreeForType(variableDeclarator.getType().resolve())
                .ifPresent(objectTree -> targetAction.getObjectTree().addAll(objectTree));
        locateExpressionResultTrees(variableDeclarator.getInitializer().get())
                .forEach(pair -> markTransference(pair, targetAction, ""));
    }
@@ -54,9 +52,8 @@ public class ExpressionObjectTreeFinder {
    }

    public void handleAssignExpr(AssignExpr assignExpr, VariableAction assignTarget, String targetMember) {
        ResolvedReferenceType type = assignExpr.getTarget().calculateResolvedType().asReferenceType();
        var fields = ClassGraph.getInstance().generateObjectTreeFor(type);
        assignTarget.getObjectTree().addAll(fields);
        ClassGraph.getInstance().generateObjectTreeForType(assignExpr.getTarget().calculateResolvedType())
                .ifPresent(fields -> assignTarget.getObjectTree().addAll(fields));
        locateExpressionResultTrees(assignExpr.getValue())
                .forEach(pair -> markTransference(pair, assignTarget, targetMember));
    }
@@ -97,6 +94,10 @@ public class ExpressionObjectTreeFinder {
            public void visit(NameExpr n, String arg) {
                if (n.resolve().isType())
                    return;
                if (n.resolve().isField()) {
                    new FieldAccessExpr(new ThisExpr(), n.getNameAsString()).accept(this, arg);
                    return;
                }
                for (VariableAction action : graphNode.getVariableActions()) {
                    if (action.isUsage() && action.getName().equals(n.getNameAsString())) {
                        list.add(new Pair<>(action, arg));
@@ -160,6 +161,7 @@ public class ExpressionObjectTreeFinder {
    protected void markTransference(Pair<VariableAction, String> sourcePair, VariableAction targetAction, String targetMember) {
        VariableAction sourceAction = sourcePair.a;
        String sourceMember = sourcePair.b;
        if (sourceAction.hasObjectTree() && !sourceAction.getObjectTree().isLeaf(sourceMember))
            ObjectTree.copyTree(sourceAction.getObjectTree(), targetAction.getObjectTree(), sourceMember, targetMember);
        sourceAction.setPDGTreeConnectionTo(targetAction, sourceMember, targetMember);
    }
+12 −13
Original line number Diff line number Diff line
@@ -199,8 +199,7 @@ public class JSysCFG extends ESCFG {
        protected void expandOutputVariable(CallableDeclaration<?> callableDeclaration, VariableAction useOutput) {
            // Generate the full tree for the method's returned type (static)
            var fields = classGraph.generateObjectTreeForReturnOf(callableDeclaration);
            if (fields.isEmpty())
                return;
            if (fields.isPresent()) {
                // Insert tree into the OutputNode
                useOutput.getObjectTree().addAll(fields.get());
                // Insert tree into GraphNode<ReturnStmt> nodes, the last action is always DEF(-output-)
@@ -210,13 +209,13 @@ public class JSysCFG extends ESCFG {
                        .map(list -> list.get(list.size() - 1))
                        .map(VariableAction::getObjectTree)
                        .forEach(tree -> tree.addAll(fields.get()));
            }
            // Generate the assignment trees and prepare for linking
            vertexSet().stream()
                    .filter(gn -> gn.getAstNode() instanceof ReturnStmt)
                    .forEach(gn -> {
                        Expression expr = ((ReturnStmt) gn.getAstNode()).getExpression().orElseThrow();
                        ExpressionObjectTreeFinder finder = new ExpressionObjectTreeFinder(gn);
                        finder.locateAndMarkTransferenceToRoot(expr, -1);
                        new ExpressionObjectTreeFinder(gn).locateAndMarkTransferenceToRoot(expr, -1);
                    });
        }
    }
+2 −5
Original line number Diff line number Diff line
@@ -107,12 +107,9 @@ public class JSysPDG extends ESPDG {
                            jSysCFG.findLastDefinitionOfPrimitive(varAct).forEach(def -> addFlowDependencyArc(def, varAct));
                        else {
                            jSysCFG.findLastDefinitionOfObjectRoot(varAct).forEach(def -> addObjectFlowDependencyArc(def, varAct));
                            if (varAct.hasObjectTree()) {
                                for (String member : varAct.getObjectTree().nameIterable()) {
                            if (varAct.hasObjectTree())
                                for (String member : varAct.getObjectTree().nameIterable())
                                    jSysCFG.findLastDefinitionOfObjectMember(varAct, member).forEach(def -> addFlowDependencyArc(def, varAct, member));
                                    addValueDependencyArc(varAct, member, node);
                                }
                            }
                        }
                    } else if (varAct.isDefinition()) {
                        if (!varAct.isSynthetic())
+4 −0
Original line number Diff line number Diff line
@@ -75,6 +75,10 @@ public class ObjectTree implements Cloneable {
                childrenMap.put(entry.getKey(), entry.getValue().clone(this));
    }

    public boolean isLeaf(String memberWithoutRoot) {
        return findObjectTreeOfMember(memberWithoutRoot).childrenMap.isEmpty();
    }

    /**
     * Copies a subtree from source into another subtree in target.
     *
Loading