|
16 | 16 | import java.util.concurrent.ThreadFactory; |
17 | 17 | import java.util.concurrent.TimeUnit; |
18 | 18 | import java.util.function.Supplier; |
| 19 | +import java.util.stream.Collectors; |
19 | 20 |
|
20 | 21 | import org.slf4j.Logger; |
21 | 22 | import org.slf4j.LoggerFactory; |
22 | 23 |
|
| 24 | +import com.google.common.collect.Iterators; |
| 25 | +import com.google.common.collect.Streams; |
| 26 | + |
23 | 27 | import heros.solver.Pair; |
24 | 28 | import soot.ArrayType; |
25 | 29 | import soot.Body; |
@@ -527,7 +531,11 @@ protected void constructCallgraph() { |
527 | 531 | if (config.getCallgraphAlgorithm() != CallgraphAlgorithm.OnDemand && !Scene.v().hasCallGraph()) { |
528 | 532 | if (config.getAliasingAlgorithm() == AliasingAlgorithm.PtsBased) { |
529 | 533 | //we need to split here already for the PTS to work correctly |
530 | | - splitAllBodies(); |
| 534 | + Iterator<SootMethod> allMethods = Iterators |
| 535 | + .concat(Streams.stream(Scene.v().getApplicationClasses().snapshotIterator()).map(a -> { |
| 536 | + return a.getMethods().iterator(); |
| 537 | + }).collect(Collectors.toList()).iterator()); |
| 538 | + splitAllBodies(allMethods); |
531 | 539 | } |
532 | 540 |
|
533 | 541 | PackManager.v().getPack("wjpp").apply(); |
@@ -920,7 +928,7 @@ protected void runAnalysis(final ISourceSinkManager sourcesSinks, final Set<Stri |
920 | 928 | config.getEnableExceptionTracking()); |
921 | 929 |
|
922 | 930 | if (config.isTaintAnalysisEnabled()) { |
923 | | - splitAllBodies(); |
| 931 | + splitAllBodies(Scene.v().getReachableMethods().listener()); |
924 | 932 | try { |
925 | 933 | runTaintAnalysis(sourcesSinks, additionalSeeds, iCfg, performanceData); |
926 | 934 | } finally { |
@@ -983,13 +991,13 @@ private void unsplitAllBodies() { |
983 | 991 | //With newer soot versions, locals are reused more often, which |
984 | 992 | //can be a problem for FlowDroid. So, we split the locals prior to |
985 | 993 | //running FlowDroid. |
986 | | - protected void splitAllBodies() { |
| 994 | + protected void splitAllBodies(Iterator<? extends MethodOrMethodContext> it) { |
987 | 995 | FlowDroidLocalSplitter splitter = FlowDroidLocalSplitter.v(); |
988 | | - for (SootClass sc : new ArrayList<>(Scene.v().getApplicationClasses())) { |
989 | | - for (SootMethod m : new ArrayList<>(sc.getMethods())) { |
990 | | - if (m.isConcrete()) { |
991 | | - splitter.transform(m.retrieveActiveBody()); |
992 | | - } |
| 996 | + while (it.hasNext()) { |
| 997 | + MethodOrMethodContext mc = it.next(); |
| 998 | + SootMethod m = mc.method(); |
| 999 | + if (m.isConcrete()) { |
| 1000 | + splitter.transform(m.retrieveActiveBody()); |
993 | 1001 | } |
994 | 1002 | } |
995 | 1003 | } |
|
0 commit comments