Skip to content

Commit 2e56704

Browse files
committed
fixed incompatible shutdown behaviors
1 parent e3e093b commit 2e56704

File tree

3 files changed

+51
-13
lines changed

3 files changed

+51
-13
lines changed

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454
import soot.jimple.infoflow.data.AbstractionAtSink;
5555
import soot.jimple.infoflow.data.AccessPathFactory;
5656
import soot.jimple.infoflow.data.FlowDroidMemoryManager.PathDataErasureMode;
57-
import soot.jimple.infoflow.data.pathBuilders.BatchPathBuilder;
5857
import soot.jimple.infoflow.data.pathBuilders.DefaultPathBuilderFactory;
5958
import soot.jimple.infoflow.data.pathBuilders.IAbstractionPathBuilder;
6059
import soot.jimple.infoflow.data.pathBuilders.IAbstractionPathBuilder.OnPathBuilderResultAvailable;
@@ -771,7 +770,7 @@ else if (logger.isInfoEnabled()) {
771770
* @return The path builder implementation
772771
*/
773772
protected IAbstractionPathBuilder createPathBuilder(InterruptableExecutor executor) {
774-
return new BatchPathBuilder(manager, pathBuilderFactory.createPathBuilder(manager, executor));
773+
return pathBuilderFactory.createPathBuilder(manager, executor);
775774
}
776775

777776
/**

soot-infoflow/src/soot/jimple/infoflow/data/pathBuilders/BatchPathBuilder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222
*/
2323
public class BatchPathBuilder extends AbstractAbstractionPathBuilder {
2424

25-
private final IAbstractionPathBuilder innerBuilder;
26-
private int batchSize = 5;
27-
private ISolverTerminationReason terminationReason = null;
25+
protected final IAbstractionPathBuilder innerBuilder;
26+
protected int batchSize = 5;
27+
protected ISolverTerminationReason terminationReason = null;
2828

2929
public BatchPathBuilder(InfoflowManager manager, IAbstractionPathBuilder innerBuilder) {
3030
super(manager);

soot-infoflow/src/soot/jimple/infoflow/data/pathBuilders/DefaultPathBuilderFactory.java

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package soot.jimple.infoflow.data.pathBuilders;
22

3+
import java.util.Set;
34
import java.util.concurrent.LinkedBlockingQueue;
45
import java.util.concurrent.ThreadFactory;
56
import java.util.concurrent.TimeUnit;
67

78
import soot.jimple.infoflow.InfoflowConfiguration.PathBuildingAlgorithm;
89
import soot.jimple.infoflow.InfoflowConfiguration.PathConfiguration;
910
import soot.jimple.infoflow.InfoflowManager;
11+
import soot.jimple.infoflow.data.AbstractionAtSink;
1012
import soot.jimple.infoflow.solver.executors.InterruptableExecutor;
1113

1214
/**
@@ -18,11 +20,49 @@ public class DefaultPathBuilderFactory implements IPathBuilderFactory {
1820

1921
private final PathConfiguration pathConfiguration;
2022

23+
/**
24+
* Repeatable context-senisitive path builder
25+
*
26+
* @author Steven Arzt
27+
*
28+
*/
29+
private static class RepeatableContextSensitivePathBuilder extends ContextSensitivePathBuilder {
30+
31+
public RepeatableContextSensitivePathBuilder(InfoflowManager manager) {
32+
super(manager);
33+
}
34+
35+
@Override
36+
protected void onTaintPathsComputed() {
37+
// Do not terminate the executor
38+
}
39+
40+
}
41+
42+
/**
43+
* Variant of the {@link BatchPathBuilder} that can shut down the inner builder
44+
*
45+
* @author Steven Arzt
46+
*
47+
*/
48+
private static class ShutdownBatchPathBuilder extends BatchPathBuilder {
49+
50+
public ShutdownBatchPathBuilder(InfoflowManager manager, RepeatableContextSensitivePathBuilder innerBuilder) {
51+
super(manager, innerBuilder);
52+
}
53+
54+
@Override
55+
public void computeTaintPaths(Set<AbstractionAtSink> res) {
56+
super.computeTaintPaths(res);
57+
((RepeatableContextSensitivePathBuilder) innerBuilder).onTaintPathsComputed();
58+
}
59+
60+
}
61+
2162
/**
2263
* Creates a new instance of the {@link DefaultPathBuilderFactory} class
2364
*
24-
* @param config
25-
* The configuration for reconstructing data flow paths
65+
* @param config The configuration for reconstructing data flow paths
2666
*/
2767
public DefaultPathBuilderFactory(PathConfiguration config) {
2868
this.pathConfiguration = config;
@@ -31,8 +71,7 @@ public DefaultPathBuilderFactory(PathConfiguration config) {
3171
/**
3272
* Creates a new executor object for spawning worker threads
3373
*
34-
* @param maxThreadNum
35-
* The number of threads to use
74+
* @param maxThreadNum The number of threads to use
3675
* @return The generated executor
3776
*/
3877
private InterruptableExecutor createExecutor(int maxThreadNum) {
@@ -60,13 +99,13 @@ public IAbstractionPathBuilder createPathBuilder(InfoflowManager manager, int ma
6099
public IAbstractionPathBuilder createPathBuilder(InfoflowManager manager, InterruptableExecutor executor) {
61100
switch (pathConfiguration.getPathBuildingAlgorithm()) {
62101
case Recursive:
63-
return new RecursivePathBuilder(manager, executor);
102+
return new BatchPathBuilder(manager, new RecursivePathBuilder(manager, executor));
64103
case ContextSensitive:
65-
return new ContextSensitivePathBuilder(manager);
104+
return new ShutdownBatchPathBuilder(manager, new RepeatableContextSensitivePathBuilder(manager));
66105
case ContextInsensitive:
67-
return new ContextInsensitivePathBuilder(manager, executor);
106+
return new BatchPathBuilder(manager, new ContextInsensitivePathBuilder(manager, executor));
68107
case ContextInsensitiveSourceFinder:
69-
return new ContextInsensitiveSourceFinder(manager, executor);
108+
return new BatchPathBuilder(manager, new ContextInsensitiveSourceFinder(manager, executor));
70109
case None:
71110
return new EmptyPathBuilder();
72111
}

0 commit comments

Comments
 (0)