package it.unitn.repoman.core.slicers; import java.util.*; import it.unitn.repoman.core.lang.LanguageFactory; import it.unitn.repoman.core.lang.traversals.generic.MethodCallTraversal; import it.unitn.repoman.core.lang.traversals.generic.MethodDeclarationTraversal; import it.unitn.repoman.core.slicers.tainters.BackwardTainter; import it.unitn.repoman.core.slicers.tainters.ForwardTainter; import it.unitn.repoman.core.slicers.tainters.TaintedVariableSet; import org.antlr.v4.runtime.ParserRuleContext; import it.unitn.repoman.core.lang.traversals.generic.StatementMappingTraversal; import org.antlr.v4.runtime.tree.ParseTree; public class LightweightSlice { protected final ParserRuleContext root; protected final Set selectedLines = new LinkedHashSet<>(); protected final Set collectables; protected final Set methodDeclarations; public LightweightSlice(ParserRuleContext root, Set lines) throws Exception { this.root = root; StatementMappingTraversal statementGetter = new StatementMappingTraversal(); statementGetter.traverse(this.root); collectables = statementGetter.getStatements(); methodDeclarations = statementGetter.getMethodDeclarations(); Set toAdd = new LinkedHashSet<>(); toAdd.addAll(makePass(lines)); selectedLines.addAll(toAdd); } protected Set makePass(Set lines) { Set matchedLines = new LinkedHashSet<>(); Set statements = new LinkedHashSet<>(); for (ParserRuleContext stmt : collectables) { if (lines.contains(stmt.getStart().getLine())) { statements.add(stmt); } } ForwardTainter forwardTainter = new ForwardTainter(collectables, statements); matchedLines.addAll(forwardTainter.getCollectedLines()); BackwardTainter backwardTainter = new BackwardTainter(collectables, statements); matchedLines.addAll(backwardTainter.getCollectedLines()); /* TODO: Experimental Set inter = propagrateForwardTaint(collectables, methodDeclarations, forwardTainter); matchedLines.addAll(inter); */ return matchedLines; } // TODO: Experimental protected Set propagrateForwardTaint(Set collectables, Set methodDeclarations, ForwardTainter forwardTainter) { Set collected = new LinkedHashSet<>(); // get intra-procedural tainted variables TaintedVariableSet taintedVars = forwardTainter.getTaintedVars(); // get intra-procedural tainted method calls Set taintedMethodCalls = forwardTainter.getTaintedMethodCalls(); // match a tainted method call to the corresponding method declaration for (ParserRuleContext tmc : taintedMethodCalls) { MethodCallTraversal t1 = LanguageFactory.getWrapper().getMethodCallTraversal(tmc); String methodCallName = t1.getMethodName(); for (ParserRuleContext md : methodDeclarations) { MethodDeclarationTraversal t2 = new MethodDeclarationTraversal(md); String methodDeclName = t2.getMethodName(); if (methodCallName.equals(methodDeclName) && t1.getParamsNumber() == t2.getParamsNumber()) { // ---------------- inter-procedural "expansion" goes here ---------------------------------------- // get tainted variables for the method call statement List vars = forwardTainter.getTaintedVars().getStatementVariables((ParserRuleContext) t1.getMethodContextNode()); // keep only tainted parameters List taintedParams = new LinkedList<>(); List params = t1.getParamNames(); for (int i=0; i matchedTaintedParams = new LinkedList<>(); for (int i=0; i getSelectedLines() { return this.selectedLines; } }