Skip to content

Commit 0cafb8e

Browse files
committed
Do not load everything
1 parent d3bbf86 commit 0cafb8e

1 file changed

Lines changed: 16 additions & 8 deletions

File tree

soot-infoflow/src/soot/jimple/infoflow/AbstractInfoflow.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,14 @@
1616
import java.util.concurrent.ThreadFactory;
1717
import java.util.concurrent.TimeUnit;
1818
import java.util.function.Supplier;
19+
import java.util.stream.Collectors;
1920

2021
import org.slf4j.Logger;
2122
import org.slf4j.LoggerFactory;
2223

24+
import com.google.common.collect.Iterators;
25+
import com.google.common.collect.Streams;
26+
2327
import heros.solver.Pair;
2428
import soot.ArrayType;
2529
import soot.Body;
@@ -527,7 +531,11 @@ protected void constructCallgraph() {
527531
if (config.getCallgraphAlgorithm() != CallgraphAlgorithm.OnDemand && !Scene.v().hasCallGraph()) {
528532
if (config.getAliasingAlgorithm() == AliasingAlgorithm.PtsBased) {
529533
//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);
531539
}
532540

533541
PackManager.v().getPack("wjpp").apply();
@@ -920,7 +928,7 @@ protected void runAnalysis(final ISourceSinkManager sourcesSinks, final Set<Stri
920928
config.getEnableExceptionTracking());
921929

922930
if (config.isTaintAnalysisEnabled()) {
923-
splitAllBodies();
931+
splitAllBodies(Scene.v().getReachableMethods().listener());
924932
try {
925933
runTaintAnalysis(sourcesSinks, additionalSeeds, iCfg, performanceData);
926934
} finally {
@@ -983,13 +991,13 @@ private void unsplitAllBodies() {
983991
//With newer soot versions, locals are reused more often, which
984992
//can be a problem for FlowDroid. So, we split the locals prior to
985993
//running FlowDroid.
986-
protected void splitAllBodies() {
994+
protected void splitAllBodies(Iterator<? extends MethodOrMethodContext> it) {
987995
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());
9931001
}
9941002
}
9951003
}

0 commit comments

Comments
 (0)