11package soot .jimple .infoflow .data .pathBuilders ;
22
3+ import java .util .Set ;
34import java .util .concurrent .LinkedBlockingQueue ;
45import java .util .concurrent .ThreadFactory ;
56import java .util .concurrent .TimeUnit ;
67
78import soot .jimple .infoflow .InfoflowConfiguration .PathBuildingAlgorithm ;
89import soot .jimple .infoflow .InfoflowConfiguration .PathConfiguration ;
910import soot .jimple .infoflow .InfoflowManager ;
11+ import soot .jimple .infoflow .data .AbstractionAtSink ;
1012import 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