Loading iacfg/src/main/java/es/upv/mist/slicing/graphs/icfg/ICFG.java +37 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import es.upv.mist.slicing.nodes.io.ActualIONode; import es.upv.mist.slicing.nodes.io.CallNode; import es.upv.mist.slicing.nodes.io.MethodExitNode; import es.upv.mist.slicing.utils.ASTUtils; import org.jgrapht.alg.connectivity.KosarajuStrongConnectivityInspector; import org.jgrapht.graph.DefaultDirectedGraph; import java.util.*; Loading Loading @@ -66,6 +68,7 @@ public class ICFG extends Graph implements Buildable<NodeList<CompilationUnit>> public class Builder { protected CallGraph callGraph; protected List<Set<Object>> scrs; public void build(NodeList<CompilationUnit> units) { createClassGraph(units); Loading @@ -84,8 +87,42 @@ public class ICFG extends Graph implements Buildable<NodeList<CompilationUnit>> copyCFGs(); expandCalls(); joinCFGs(); getSCRs(callGraph); } protected void getSCRs(CallGraph callGraph) { DefaultDirectedGraph<Object, CallGraph.Edge> convertedCallGraph = deleteDuplicatedEdges(callGraph); KosarajuStrongConnectivityInspector<Object, CallGraph.Edge> inspector = new KosarajuStrongConnectivityInspector<>(convertedCallGraph); scrs = inspector.stronglyConnectedSets(); } public static DefaultDirectedGraph<Object, CallGraph.Edge> deleteDuplicatedEdges(CallGraph callGraph) { DefaultDirectedGraph<Object, CallGraph.Edge> simpleGraph = new DefaultDirectedGraph<>(CallGraph.Edge.class); for (CallGraph.Vertex v : callGraph.vertexSet()) { simpleGraph.addVertex(v); } Map<String, CallGraph.Edge<?>> edgeMap = new HashMap<>(); for (CallGraph.Edge<?> edge : callGraph.edgeSet()) { CallGraph.Vertex src = callGraph.getEdgeSource(edge); CallGraph.Vertex tgt = callGraph.getEdgeTarget(edge); String key = src.getDeclaration().getDeclarationAsString() + "->" + tgt.getDeclaration().getDeclarationAsString(); if (!edgeMap.containsKey(key)) { simpleGraph.addEdge(src, tgt, edge); edgeMap.put(key, edge); } } return simpleGraph; } protected void buildCFGs(NodeList<CompilationUnit> nodeList) { nodeList.accept(new VoidVisitorAdapter<Void>() { @Override Loading iacfg/src/test/java/es/upv/mist/slicing/graphs/icfg/ICFGTest.java +6 −3 Original line number Diff line number Diff line Loading @@ -14,17 +14,20 @@ public class ICFGTest { StaticJavaParser.getConfiguration().setAttributeComments(false); StaticTypeSolver.addTypeSolverJRE(); /*createGraph("TestInicial.java", "grafoInicial"); createGraph("TestInicial.java", "grafoInicial"); System.out.println("Grafo 1 generado..."); createGraph("TestGlobalVariables.java", "grafoGlobalVariables"); System.out.println("Grafo 2 generado..."); createGraph("TestEmbebedFunctions.java", "grafoEmbebedFunctions"; System.out.println("Grafo 3 generado...");*/ createGraph("TestEmbebedFunctions.java", "grafoEmbebedFunctions"); System.out.println("Grafo 3 generado..."); createGraph("TestInlineFunctions.java", "grafoInlineVariables"); System.out.println("Grafo 4 generado..."); createGraph("TestExamplePaper.java", "grafoInlineVariables"); System.out.println("Grafo 5 generado..."); } private static void createGraph(String fileName, String graphName) throws IOException { Loading Loading
iacfg/src/main/java/es/upv/mist/slicing/graphs/icfg/ICFG.java +37 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import es.upv.mist.slicing.nodes.io.ActualIONode; import es.upv.mist.slicing.nodes.io.CallNode; import es.upv.mist.slicing.nodes.io.MethodExitNode; import es.upv.mist.slicing.utils.ASTUtils; import org.jgrapht.alg.connectivity.KosarajuStrongConnectivityInspector; import org.jgrapht.graph.DefaultDirectedGraph; import java.util.*; Loading Loading @@ -66,6 +68,7 @@ public class ICFG extends Graph implements Buildable<NodeList<CompilationUnit>> public class Builder { protected CallGraph callGraph; protected List<Set<Object>> scrs; public void build(NodeList<CompilationUnit> units) { createClassGraph(units); Loading @@ -84,8 +87,42 @@ public class ICFG extends Graph implements Buildable<NodeList<CompilationUnit>> copyCFGs(); expandCalls(); joinCFGs(); getSCRs(callGraph); } protected void getSCRs(CallGraph callGraph) { DefaultDirectedGraph<Object, CallGraph.Edge> convertedCallGraph = deleteDuplicatedEdges(callGraph); KosarajuStrongConnectivityInspector<Object, CallGraph.Edge> inspector = new KosarajuStrongConnectivityInspector<>(convertedCallGraph); scrs = inspector.stronglyConnectedSets(); } public static DefaultDirectedGraph<Object, CallGraph.Edge> deleteDuplicatedEdges(CallGraph callGraph) { DefaultDirectedGraph<Object, CallGraph.Edge> simpleGraph = new DefaultDirectedGraph<>(CallGraph.Edge.class); for (CallGraph.Vertex v : callGraph.vertexSet()) { simpleGraph.addVertex(v); } Map<String, CallGraph.Edge<?>> edgeMap = new HashMap<>(); for (CallGraph.Edge<?> edge : callGraph.edgeSet()) { CallGraph.Vertex src = callGraph.getEdgeSource(edge); CallGraph.Vertex tgt = callGraph.getEdgeTarget(edge); String key = src.getDeclaration().getDeclarationAsString() + "->" + tgt.getDeclaration().getDeclarationAsString(); if (!edgeMap.containsKey(key)) { simpleGraph.addEdge(src, tgt, edge); edgeMap.put(key, edge); } } return simpleGraph; } protected void buildCFGs(NodeList<CompilationUnit> nodeList) { nodeList.accept(new VoidVisitorAdapter<Void>() { @Override Loading
iacfg/src/test/java/es/upv/mist/slicing/graphs/icfg/ICFGTest.java +6 −3 Original line number Diff line number Diff line Loading @@ -14,17 +14,20 @@ public class ICFGTest { StaticJavaParser.getConfiguration().setAttributeComments(false); StaticTypeSolver.addTypeSolverJRE(); /*createGraph("TestInicial.java", "grafoInicial"); createGraph("TestInicial.java", "grafoInicial"); System.out.println("Grafo 1 generado..."); createGraph("TestGlobalVariables.java", "grafoGlobalVariables"); System.out.println("Grafo 2 generado..."); createGraph("TestEmbebedFunctions.java", "grafoEmbebedFunctions"; System.out.println("Grafo 3 generado...");*/ createGraph("TestEmbebedFunctions.java", "grafoEmbebedFunctions"); System.out.println("Grafo 3 generado..."); createGraph("TestInlineFunctions.java", "grafoInlineVariables"); System.out.println("Grafo 4 generado..."); createGraph("TestExamplePaper.java", "grafoInlineVariables"); System.out.println("Grafo 5 generado..."); } private static void createGraph(String fileName, String graphName) throws IOException { Loading