@@ -267,21 +267,24 @@ public void getPredecessor(Statement pred) {
267267 BackwardQuery bwq =
268268 BackwardQuery .make (new Edge (pred , stmt ), stmt .getInvokeExpr ().getArg (0 ));
269269 backwardSolve (bwq );
270- for (ForwardQuery q : Lists .newArrayList (queryToSolvers .keySet ())) {
271- if (queryToSolvers .get (q ).getReachedStates ().contains (bwq .asNode ())) {
272- AllocVal v = q .getAllocVal ();
273- if (v .getAllocVal ().isStringConstant ()) {
274- String key = v .getAllocVal ().getStringValue ();
275- backwardSolverIns .propagate (
276- node ,
277- new PushNode <>(
278- new Edge (pred , stmt ),
279- stmt .getInvokeExpr ().getBase (),
280- StringBasedField .getInstance (key ),
281- PDSSystem .FIELDS ));
282- }
283- }
284- }
270+ WeightedBoomerang .this .registerSolverCreationListener (
271+ (q , solver ) ->
272+ solver .registerListener (
273+ n -> {
274+ if (n .equals (bwq .asNode ()) && q instanceof ForwardQuery ) {
275+ AllocVal v = ((ForwardQuery ) q ).getAllocVal ();
276+ if (v .getAllocVal ().isStringConstant ()) {
277+ String key = v .getAllocVal ().getStringValue ();
278+ backwardSolverIns .propagate (
279+ node ,
280+ new PushNode <>(
281+ new Edge (pred , stmt ),
282+ stmt .getInvokeExpr ().getBase (),
283+ StringBasedField .getInstance (key ),
284+ PDSSystem .FIELDS ));
285+ }
286+ }
287+ }));
285288 }
286289 });
287290 }
@@ -296,21 +299,25 @@ public void getPredecessor(Statement pred) {
296299 BackwardQuery bwq =
297300 BackwardQuery .make (new Edge (pred , stmt ), stmt .getInvokeExpr ().getArg (0 ));
298301 backwardSolve (bwq );
299- for (ForwardQuery q : Lists .newArrayList (queryToSolvers .keySet ())) {
300- if (queryToSolvers .get (q ).getReachedStates ().contains (bwq .asNode ())) {
301- AllocVal v = q .getAllocVal ();
302-
303- if (v .getAllocVal ().isStringConstant ()) {
304- String key = v .getAllocVal ().getStringValue ();
305- NodeWithLocation <Edge , Val , Field > succNode =
306- new NodeWithLocation <>(
307- new Edge (pred , stmt ),
308- stmt .getInvokeExpr ().getArg (1 ),
309- StringBasedField .getInstance (key ));
310- backwardSolverIns .propagate (node , new PopNode <>(succNode , PDSSystem .FIELDS ));
311- }
312- }
313- }
302+ WeightedBoomerang .this .registerSolverCreationListener (
303+ (q , solver ) ->
304+ solver .registerListener (
305+ n -> {
306+ if (n .equals (bwq .asNode ()) && q instanceof ForwardQuery ) {
307+ AllocVal v = ((ForwardQuery ) q ).getAllocVal ();
308+
309+ if (v .getAllocVal ().isStringConstant ()) {
310+ String key = v .getAllocVal ().getStringValue ();
311+ NodeWithLocation <Edge , Val , Field > succNode =
312+ new NodeWithLocation <>(
313+ new Edge (pred , stmt ),
314+ stmt .getInvokeExpr ().getArg (1 ),
315+ StringBasedField .getInstance (key ));
316+ backwardSolverIns .propagate (
317+ node , new PopNode <>(succNode , PDSSystem .FIELDS ));
318+ }
319+ }
320+ }));
314321 }
315322 });
316323 }
@@ -325,55 +332,60 @@ protected void handleMapsForward(ForwardBoomerangSolver<W> solver, Node<Edge, Va
325332 if (stmt .getInvokeExpr ().getBase ().equals (node .fact ())) {
326333 BackwardQuery bwq = BackwardQuery .make (node .stmt (), stmt .getInvokeExpr ().getArg (0 ));
327334 backwardSolve (bwq );
328- cfg .addSuccsOfListener (
329- new SuccessorListener (stmt ) {
330- @ Override
331- public void getSuccessor (Statement succ ) {
332- for (ForwardQuery q : Lists .newArrayList (queryToSolvers .keySet ())) {
333- if (queryToSolvers .get (q ).getReachedStates ().contains (bwq .asNode ())) {
334- AllocVal v = q .getAllocVal ();
335-
336- if (v .getAllocVal ().isStringConstant ()) {
337- String key = v .getAllocVal ().getStringValue ();
338- NodeWithLocation <Edge , Val , Field > succNode =
339- new NodeWithLocation <>(
340- new Edge (stmt , succ ),
341- stmt .getLeftOp (),
342- StringBasedField .getInstance (key ));
343- solver .propagate (node , new PopNode <>(succNode , PDSSystem .FIELDS ));
344- }
345- }
346- }
347- }
348- });
335+ registerSolverCreationListener (
336+ (q , solverForKeyArg ) ->
337+ solverForKeyArg .registerListener (
338+ n ->
339+ cfg .addSuccsOfListener (
340+ new SuccessorListener (stmt ) {
341+ @ Override
342+ public void getSuccessor (Statement succ ) {
343+ if (n .equals (bwq .asNode ()) && q instanceof ForwardQuery ) {
344+ AllocVal v = ((ForwardQuery ) q ).getAllocVal ();
345+
346+ if (v .getAllocVal ().isStringConstant ()) {
347+ String key = v .getAllocVal ().getStringValue ();
348+ NodeWithLocation <Edge , Val , Field > succNode =
349+ new NodeWithLocation <>(
350+ new Edge (stmt , succ ),
351+ stmt .getLeftOp (),
352+ StringBasedField .getInstance (key ));
353+ solver .propagate (
354+ node , new PopNode <>(succNode , PDSSystem .FIELDS ));
355+ }
356+ }
357+ }
358+ })));
349359 }
350360 }
351361 if (stmt .getInvokeExpr ().getDeclaredMethod ().toMethodWrapper ().equals (MAP_PUT_SIGNATURE )) {
352362 if (stmt .getInvokeExpr ().getArg (1 ).equals (node .fact ())) {
353363
354364 BackwardQuery bwq = BackwardQuery .make (node .stmt (), stmt .getInvokeExpr ().getArg (0 ));
355365 backwardSolve (bwq );
356- cfg .addSuccsOfListener (
357- new SuccessorListener (stmt ) {
358- @ Override
359- public void getSuccessor (Statement succ ) {
360- for (ForwardQuery q : Lists .newArrayList (queryToSolvers .keySet ())) {
361- if (queryToSolvers .get (q ).getReachedStates ().contains (bwq .asNode ())) {
362- AllocVal v = q .getAllocVal ();
363- if (v .getAllocVal ().isStringConstant ()) {
364- String key = v .getAllocVal ().getStringValue ();
365- solver .propagate (
366- node ,
367- new PushNode <>(
368- new Edge (stmt , succ ),
369- stmt .getInvokeExpr ().getBase (),
370- StringBasedField .getInstance (key ),
371- PDSSystem .FIELDS ));
372- }
373- }
374- }
375- }
376- });
366+ registerSolverCreationListener (
367+ (q , solverForKeyArg ) ->
368+ solverForKeyArg .registerListener (
369+ n ->
370+ cfg .addSuccsOfListener (
371+ new SuccessorListener (stmt ) {
372+ @ Override
373+ public void getSuccessor (Statement succ ) {
374+ if (n .equals (bwq .asNode ()) && q instanceof ForwardQuery ) {
375+ AllocVal v = ((ForwardQuery ) q ).getAllocVal ();
376+ if (v .getAllocVal ().isStringConstant ()) {
377+ String key = v .getAllocVal ().getStringValue ();
378+ solver .propagate (
379+ node ,
380+ new PushNode <>(
381+ new Edge (stmt , succ ),
382+ stmt .getInvokeExpr ().getBase (),
383+ StringBasedField .getInstance (key ),
384+ PDSSystem .FIELDS ));
385+ }
386+ }
387+ }
388+ })));
377389 }
378390 }
379391 }
@@ -988,10 +1000,14 @@ public ForwardBoomerangResults<W> solve(ForwardQuery query) {
9881000 }
9891001
9901002 public BackwardBoomerangResults <W > solve (BackwardQuery query ) {
991- return solve (query , true );
1003+ return solve (query , true , true );
9921004 }
9931005
9941006 public BackwardBoomerangResults <W > solve (BackwardQuery query , boolean timing ) {
1007+ return solve (query , timing , true );
1008+ }
1009+
1010+ public BackwardBoomerangResults <W > solve (BackwardQuery query , boolean timing , boolean fallback ) {
9951011 if (!options .allowMultipleQueries () && solving ) {
9961012 throw new RuntimeException (
9971013 "One cannot re-use the same Boomerang solver for more than one query, unless option allowMultipleQueries is enabled. If allowMultipleQueries is enabled, ensure to call unregisterAllListeners() on this instance upon termination of all queries." );
@@ -1005,6 +1021,9 @@ public BackwardBoomerangResults<W> solve(BackwardQuery query, boolean timing) {
10051021 queryGraph .addRoot (query );
10061022 LOGGER .trace ("Starting backward analysis of: {}" , query );
10071023 backwardSolve (query );
1024+ if (fallback ) {
1025+ icfg .computeFallback ();
1026+ }
10081027 } catch (BoomerangTimeoutException e ) {
10091028 timedout = true ;
10101029 LOGGER .trace ("Timeout ({}) of query: {} " , analysisWatch , query );
@@ -1037,6 +1056,7 @@ public BackwardBoomerangResults<W> solveUnderScope(
10371056 LOGGER .trace ("Starting backward analysis of: {}" , query );
10381057 backwardSolve (query );
10391058 queryGraph .addEdge (parentQuery , triggeringNode , query );
1059+ icfg .computeFallback ();
10401060 this .debugOutput ();
10411061 } catch (BoomerangTimeoutException e ) {
10421062 timedout = true ;
@@ -1064,6 +1084,7 @@ public ForwardBoomerangResults<W> solveUnderScope(
10641084 LOGGER .trace ("Starting forward analysis of: {}" , query );
10651085 forwardSolve (query );
10661086 queryGraph .addEdge (parentQuery , triggeringNode , query );
1087+ icfg .computeFallback ();
10671088 LOGGER .trace (
10681089 "Query terminated in {} ({}), visited methods {}" ,
10691090 analysisWatch ,
0 commit comments