Package boomerang.solver
Class AbstractBoomerangSolver<W extends wpds.impl.Weight>
- java.lang.Object
-
- sync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W>
-
- boomerang.solver.AbstractBoomerangSolver<W>
-
- Direct Known Subclasses:
BackwardBoomerangSolver,ForwardBoomerangSolver
public abstract class AbstractBoomerangSolver<W extends wpds.impl.Weight> extends sync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W>
-
-
Field Summary
Fields Modifier and Type Field Description protected ObservableControlFlowGraphcfgprotected DataFlowScopedataFlowScopeprotected Map<Map.Entry<sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>,Field>,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>>generatedFieldStateprotected ObservableICFG<Statement,Method>icfgprotected booleanINTERPROCEDURALprotected BoomerangOptionsoptionsprotected com.google.common.collect.Multimap<ControlFlowGraph.Edge,wpds.impl.Transition<Field,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>>>perStatementFieldTransitionsprotected Typetype
-
Constructor Summary
Constructors Constructor Description AbstractBoomerangSolver(ObservableICFG<Statement,Method> icfg, ObservableControlFlowGraph cfg, Map<Map.Entry<sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>,Field>,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>> genField, BoomerangOptions options, wpds.impl.NestedWeightedPAutomatons<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>,W> callSummaries, wpds.impl.NestedWeightedPAutomatons<Field,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>,W> fieldSummaries, DataFlowScope scope, Type propagationType)
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description voidaddCallRule(wpds.impl.Rule<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>,W> rule)voidaddFieldRule(wpds.impl.Rule<Field,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>,W> rule)protected voidaddPotentialUnbalancedFlow(Method callee, wpds.impl.Transition<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>> trans, W weight)voidallowUnbalanced(Method callee, Statement callSite)com.google.common.collect.Table<ControlFlowGraph.Edge,Val,W>asEdgeValWeightTable()com.google.common.collect.Table<Statement,Val,W>asStatementValWeightTable()protected abstract Collection<wpds.interfaces.State>computeNormalFlow(Method method, ControlFlowGraph.Edge currEdge, Val value)protected abstract Collection<? extends wpds.interfaces.State>computeReturnFlow(Method method, Statement curr, Val value)sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>createQueryNodeField(Query query)voiddebugFieldAutomaton(Statement stmt)FieldemptyField()FieldepsilonField()ControlFlowGraph.EdgeepsilonStmt()FieldexclusionFieldWildCard(Field exclusion)FieldfieldWildCard()protected booleanforceUnbalanced(sync.pds.solver.nodes.INode<Val> iNode, Collection<sync.pds.solver.nodes.INode<Val>> collection)sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>generateFieldState(sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>> d, Field loc)wpds.impl.WeightedPAutomaton<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>,W>getCallAutomaton()wpds.impl.WeightedPushdownSystem<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>,W>getCallPDS()wpds.impl.WeightedPAutomaton<Field,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>,W>getFieldAutomaton()wpds.impl.WeightedPushdownSystem<Field,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>,W>getFieldPDS()intgetNumberOfRules()com.google.common.collect.Table<ControlFlowGraph.Edge,RegExAccessPath,W>getResults(Method m)Map<RegExAccessPath,W>getResultsAt(Statement stmt)protected booleanisMatchingCallSiteCalleePair(Statement callSite, Method method)protected booleanpreventCallTransitionAdd(wpds.impl.Transition<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>> t, W weight)protected booleanpreventFieldTransitionAdd(wpds.impl.Transition<Field,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>> t, W weight)protected abstract voidpropagateUnbalancedToCallSite(Statement callSiteEdge, wpds.impl.Transition<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>> transInCallee)booleanreachesNodeWithEmptyField(sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val> node)voidregisterFieldTransitionListener(MethodBasedFieldTransitionListener<W> l)voidregisterStatementCallTransitionListener(ControlFlowEdgeBasedCallTransitionListener<W> l)voidregisterStatementFieldTransitionListener(ControlFlowEdgeBasedFieldTransitionListener<W> l)protected voidreturnFlow(Method method, sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val> currNode)voidsynchedEmptyStackReachable(sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val> sourceNode, sync.pds.solver.EmptyStackWitnessListener<ControlFlowGraph.Edge,Val> listener)voidsynchedReachable(sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val> sourceNode, sync.pds.solver.WitnessListener<ControlFlowGraph.Edge,Val,Field> listener)voidunregisterAllListeners()-
Methods inherited from class sync.pds.solver.SyncPDSSolver
addApplySummaryListener, addGeneratedFieldState, addNormalCallFlow, addNormalFieldFlow, applyCallSummary, asFieldFact, computeSuccessor, debugOutput, generateCallState, getCallWeights, getFieldWeights, getReachedStates, processNode, processNormal, processPop, processPush, propagate, registerListener, registerListener, solve, solve, wrap
-
-
-
-
Field Detail
-
icfg
protected final ObservableICFG<Statement,Method> icfg
-
cfg
protected final ObservableControlFlowGraph cfg
-
INTERPROCEDURAL
protected boolean INTERPROCEDURAL
-
generatedFieldState
protected final Map<Map.Entry<sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>,Field>,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>> generatedFieldState
-
perStatementFieldTransitions
protected com.google.common.collect.Multimap<ControlFlowGraph.Edge,wpds.impl.Transition<Field,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>>> perStatementFieldTransitions
-
dataFlowScope
protected final DataFlowScope dataFlowScope
-
options
protected final BoomerangOptions options
-
type
protected final Type type
-
-
Constructor Detail
-
AbstractBoomerangSolver
public AbstractBoomerangSolver(ObservableICFG<Statement,Method> icfg, ObservableControlFlowGraph cfg, Map<Map.Entry<sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>,Field>,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>> genField, BoomerangOptions options, wpds.impl.NestedWeightedPAutomatons<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>,W> callSummaries, wpds.impl.NestedWeightedPAutomatons<Field,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>,W> fieldSummaries, DataFlowScope scope, Type propagationType)
-
-
Method Detail
-
reachesNodeWithEmptyField
public boolean reachesNodeWithEmptyField(sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val> node)
-
createQueryNodeField
public sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>> createQueryNodeField(Query query)
-
synchedEmptyStackReachable
public void synchedEmptyStackReachable(sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val> sourceNode, sync.pds.solver.EmptyStackWitnessListener<ControlFlowGraph.Edge,Val> listener)
-
synchedReachable
public void synchedReachable(sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val> sourceNode, sync.pds.solver.WitnessListener<ControlFlowGraph.Edge,Val,Field> listener)
-
asEdgeValWeightTable
public com.google.common.collect.Table<ControlFlowGraph.Edge,Val,W> asEdgeValWeightTable()
-
asStatementValWeightTable
public com.google.common.collect.Table<Statement,Val,W> asStatementValWeightTable()
-
addPotentialUnbalancedFlow
protected void addPotentialUnbalancedFlow(Method callee, wpds.impl.Transition<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>> trans, W weight)
-
forceUnbalanced
protected boolean forceUnbalanced(sync.pds.solver.nodes.INode<Val> iNode, Collection<sync.pds.solver.nodes.INode<Val>> collection)
-
isMatchingCallSiteCalleePair
protected boolean isMatchingCallSiteCalleePair(Statement callSite, Method method)
-
propagateUnbalancedToCallSite
protected abstract void propagateUnbalancedToCallSite(Statement callSiteEdge, wpds.impl.Transition<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>> transInCallee)
-
preventCallTransitionAdd
protected boolean preventCallTransitionAdd(wpds.impl.Transition<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>> t, W weight)
- Overrides:
preventCallTransitionAddin classsync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>
-
addCallRule
public void addCallRule(wpds.impl.Rule<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>,W> rule)
- Overrides:
addCallRulein classsync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>
-
addFieldRule
public void addFieldRule(wpds.impl.Rule<Field,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>,W> rule)
- Overrides:
addFieldRulein classsync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>
-
registerFieldTransitionListener
public void registerFieldTransitionListener(MethodBasedFieldTransitionListener<W> l)
-
registerStatementFieldTransitionListener
public void registerStatementFieldTransitionListener(ControlFlowEdgeBasedFieldTransitionListener<W> l)
-
registerStatementCallTransitionListener
public void registerStatementCallTransitionListener(ControlFlowEdgeBasedCallTransitionListener<W> l)
-
generateFieldState
public sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>> generateFieldState(sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>> d, Field loc)
- Overrides:
generateFieldStatein classsync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>
-
computeReturnFlow
protected abstract Collection<? extends wpds.interfaces.State> computeReturnFlow(Method method, Statement curr, Val value)
-
returnFlow
protected void returnFlow(Method method, sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val> currNode)
-
computeNormalFlow
protected abstract Collection<wpds.interfaces.State> computeNormalFlow(Method method, ControlFlowGraph.Edge currEdge, Val value)
-
epsilonField
public Field epsilonField()
- Specified by:
epsilonFieldin classsync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>
-
emptyField
public Field emptyField()
- Specified by:
emptyFieldin classsync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>
-
epsilonStmt
public ControlFlowGraph.Edge epsilonStmt()
- Specified by:
epsilonStmtin classsync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>
-
fieldWildCard
public Field fieldWildCard()
- Specified by:
fieldWildCardin classsync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>
-
exclusionFieldWildCard
public Field exclusionFieldWildCard(Field exclusion)
- Specified by:
exclusionFieldWildCardin classsync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>
-
getFieldAutomaton
public wpds.impl.WeightedPAutomaton<Field,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>,W> getFieldAutomaton()
-
getCallAutomaton
public wpds.impl.WeightedPAutomaton<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>,W> getCallAutomaton()
-
getCallPDS
public wpds.impl.WeightedPushdownSystem<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>,W> getCallPDS()
-
getFieldPDS
public wpds.impl.WeightedPushdownSystem<Field,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>,W> getFieldPDS()
-
getNumberOfRules
public int getNumberOfRules()
-
preventFieldTransitionAdd
protected boolean preventFieldTransitionAdd(wpds.impl.Transition<Field,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>> t, W weight)
- Overrides:
preventFieldTransitionAddin classsync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>
-
getResultsAt
public Map<RegExAccessPath,W> getResultsAt(Statement stmt)
-
getResults
public com.google.common.collect.Table<ControlFlowGraph.Edge,RegExAccessPath,W> getResults(Method m)
-
debugFieldAutomaton
public void debugFieldAutomaton(Statement stmt)
-
unregisterAllListeners
public void unregisterAllListeners()
-
-