| 1 19 20 package edu.umd.cs.findbugs.ba; 21 22 import java.util.Iterator ; 23 import java.util.LinkedList ; 24 import java.util.List ; 25 26 import edu.umd.cs.findbugs.SystemProperties; 27 28 40 public class SimplePathEnumerator implements EdgeTypes, DFSEdgeTypes { 41 private CFG cfg; 42 private DepthFirstSearch dfs; 43 private int maxPaths; 44 private int maxWork; 45 private int work; 46 private List <List <Edge>> pathList; 47 48 private static final boolean DEBUG = SystemProperties.getBoolean("spe.debug"); 49 50 53 public static final int DEFAULT_MAX_WORK = 200000; 54 55 63 public SimplePathEnumerator(CFG cfg, int maxPaths, int maxWork) { 64 this.cfg = cfg; 65 this.dfs = new DepthFirstSearch(cfg); 66 dfs.search(); 67 this.maxPaths = maxPaths; 68 this.maxWork = maxWork; 69 this.work = 0; 70 this.pathList = new LinkedList <List <Edge>>(); 71 } 72 73 79 public SimplePathEnumerator(CFG cfg, int maxPaths) { 80 this(cfg, maxPaths, DEFAULT_MAX_WORK); 81 } 82 83 88 public SimplePathEnumerator enumerate() { 89 Iterator <Edge> entryOut = cfg.outgoingEdgeIterator(cfg.getEntry()); 90 if (!entryOut.hasNext()) throw new IllegalStateException (); 91 Edge entryEdge = entryOut.next(); 92 93 LinkedList <Edge> init = new LinkedList <Edge>(); 94 init.add(entryEdge); 95 96 work(init); 97 if (DEBUG && work == maxWork) System.out.println("**** Reached max work! ****"); 98 99 return this; 100 } 101 102 105 public Iterator <List <Edge>> iterator() { 106 return pathList.iterator(); 107 } 108 109 private void work(LinkedList <Edge> partialPath) { 110 if (pathList.size() == maxPaths) 111 return; 112 113 Edge last = partialPath.getLast(); 114 115 if (last.getTarget() == cfg.getExit()) { 117 pathList.add(new LinkedList <Edge>(partialPath)); 118 return; 119 } 120 121 Iterator <Edge> i = cfg.outgoingEdgeIterator(last.getTarget()); 123 while (i.hasNext()) { 124 Edge outEdge = i.next(); 125 126 if (dfs.getDFSEdgeType(outEdge) == BACK_EDGE || outEdge.getType() == UNHANDLED_EXCEPTION_EDGE) 128 continue; 129 130 partialPath.add(outEdge); 132 work(partialPath); 133 partialPath.removeLast(); 134 135 if (work == maxWork) 137 return; 138 ++work; 139 140 if (pathList.size() == maxPaths) 142 return; 143 } 144 } 145 } 146 147 | Popular Tags |