package tools.argumentTainter; import java.util.Collection; import java.util.LinkedList; import java.util.List; import neo4j.readWriteDB.Neo4JDBInterface; import neo4j.traversals.readWriteDB.Traversals; import org.neo4j.graphdb.Node; import ddg.DefUseCFG.DefUseCFG; import ddg.DefUseCFG.DefUseCFGFactory; import ddg.DefUseCFG.ReadWriteDbFactory; public class FunctionPatcher { private DefUseCFGFactory defUseGraphFactory = new ReadWriteDbFactory(); private Collection<Node> statementsToPatch = new LinkedList<Node>(); private DefUseCFG defUseCFG = null; private String sourceToPatch; private int argumentToPatch; public void setSourceToPatch(String source) { sourceToPatch = source; } public void setArgumentToPatch(int argToPatch) { argumentToPatch = argToPatch; } public void reset() { statementsToPatch.clear(); defUseCFG = null; } public void patch(Long funcId) { determineCallsToPatch(funcId); retrieveDefUseCFGFromDatabase(funcId); patchDefUseCFG(); patchDDG(funcId); } private void determineCallsToPatch(Long funcId) { List<Node> callNodes = Traversals.getCallsToForFunction(sourceToPatch, funcId); for (Node callNode : callNodes) { statementsToPatch.add(Traversals.getStatementForASTNode(callNode)); } } private void retrieveDefUseCFGFromDatabase(long funcId) { defUseCFG = defUseGraphFactory.create(funcId); } private void patchDefUseCFG() { DefUseCFGPatcher patcher = new DefUseCFGPatcher(); patcher.setSourceToPatch(sourceToPatch, argumentToPatch); patcher.patchDefUseCFG(defUseCFG, statementsToPatch); patcher.writeChangesToDatabase(); } private void patchDDG(Long funcId) { DDGPatcher patcher = new DDGPatcher(); patcher.patchDDG(defUseCFG, funcId); patcher.writeChangesToDatabase(); } }