public abstract class AbstractBoomerangSolver<W extends wpds.impl.Weight> extends sync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W>
| Modifier and Type | Field and Description |
|---|---|
protected ObservableControlFlowGraph |
cfg |
protected DataFlowScope |
dataFlowScope |
protected 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 |
protected ObservableICFG<Statement,Method> |
icfg |
protected boolean |
INTERPROCEDURAL |
protected BoomerangOptions |
options |
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 |
protected Type |
type |
| Constructor and 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) |
| Modifier and Type | Method and Description |
|---|---|
void |
addCallRule(wpds.impl.Rule<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>,W> rule) |
void |
addFieldRule(wpds.impl.Rule<Field,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>,W> rule) |
protected void |
addPotentialUnbalancedFlow(Method callee,
wpds.impl.Transition<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>> trans,
W weight) |
void |
allowUnbalanced(Method callee,
Statement callSite) |
com.google.common.collect.Table<ControlFlowGraph.Edge,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) |
void |
debugFieldAutomaton(Statement stmt) |
Field |
emptyField() |
Field |
epsilonField() |
ControlFlowGraph.Edge |
epsilonStmt() |
Field |
exclusionFieldWildCard(Field exclusion) |
Field |
fieldWildCard() |
protected boolean |
forceUnbalanced(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() |
int |
getNumberOfRules() |
com.google.common.collect.Table<ControlFlowGraph.Edge,RegExAccessPath,W> |
getResults(Method m) |
Map<RegExAccessPath,W> |
getResultsAt(Statement stmt) |
protected boolean |
isMatchingCallSiteCalleePair(Statement callSite,
Method method) |
protected boolean |
preventCallTransitionAdd(wpds.impl.Transition<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>> t,
W weight) |
protected boolean |
preventFieldTransitionAdd(wpds.impl.Transition<Field,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>> t,
W weight) |
protected abstract void |
propagateUnbalancedToCallSite(Statement callSiteEdge,
wpds.impl.Transition<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>> transInCallee) |
boolean |
reachesNodeWithEmptyField(sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val> node) |
void |
registerFieldTransitionListener(MethodBasedFieldTransitionListener<W> l) |
void |
registerStatementCallTransitionListener(ControlFlowEdgeBasedCallTransitionListener<W> l) |
void |
registerStatementFieldTransitionListener(ControlFlowEdgeBasedFieldTransitionListener<W> l) |
protected void |
returnFlow(Method method,
sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val> currNode) |
void |
synchedEmptyStackReachable(sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val> sourceNode,
sync.pds.solver.EmptyStackWitnessListener<ControlFlowGraph.Edge,Val> listener) |
void |
synchedReachable(sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val> sourceNode,
sync.pds.solver.WitnessListener<ControlFlowGraph.Edge,Val,Field> listener) |
void |
unregisterAllListeners() |
addApplySummaryListener, addGeneratedFieldState, addNormalCallFlow, addNormalFieldFlow, applyCallSummary, asFieldFact, computeSuccessor, debugOutput, generateCallState, getCallWeights, getFieldWeights, getReachedStates, processNode, processNormal, processPop, processPush, propagate, registerListener, registerListener, solve, solve, wrapprotected final ObservableICFG<Statement,Method> icfg
protected final ObservableControlFlowGraph cfg
protected boolean INTERPROCEDURAL
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
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
protected final DataFlowScope dataFlowScope
protected final BoomerangOptions options
protected final Type type
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)
public boolean reachesNodeWithEmptyField(sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val> node)
public sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>> createQueryNodeField(Query query)
public void synchedEmptyStackReachable(sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val> sourceNode, sync.pds.solver.EmptyStackWitnessListener<ControlFlowGraph.Edge,Val> listener)
public void synchedReachable(sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val> sourceNode, sync.pds.solver.WitnessListener<ControlFlowGraph.Edge,Val,Field> listener)
public com.google.common.collect.Table<ControlFlowGraph.Edge,Val,W> asStatementValWeightTable()
protected void addPotentialUnbalancedFlow(Method callee, wpds.impl.Transition<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>> trans, W weight)
protected boolean forceUnbalanced(sync.pds.solver.nodes.INode<Val> iNode, Collection<sync.pds.solver.nodes.INode<Val>> collection)
protected boolean isMatchingCallSiteCalleePair(Statement callSite, Method method)
protected abstract void propagateUnbalancedToCallSite(Statement callSiteEdge, wpds.impl.Transition<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>> transInCallee)
protected boolean preventCallTransitionAdd(wpds.impl.Transition<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>> t, W weight)
preventCallTransitionAdd in class sync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>public void addCallRule(wpds.impl.Rule<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>,W> rule)
addCallRule in class sync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>public void addFieldRule(wpds.impl.Rule<Field,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>,W> rule)
addFieldRule in class sync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>public void registerFieldTransitionListener(MethodBasedFieldTransitionListener<W> l)
public void registerStatementFieldTransitionListener(ControlFlowEdgeBasedFieldTransitionListener<W> l)
public void registerStatementCallTransitionListener(ControlFlowEdgeBasedCallTransitionListener<W> l)
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)
generateFieldState in class sync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>protected abstract Collection<? extends wpds.interfaces.State> computeReturnFlow(Method method, Statement curr, Val value)
protected void returnFlow(Method method, sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val> currNode)
protected abstract Collection<wpds.interfaces.State> computeNormalFlow(Method method, ControlFlowGraph.Edge currEdge, Val value)
public Field epsilonField()
epsilonField in class sync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>public Field emptyField()
emptyField in class sync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>public ControlFlowGraph.Edge epsilonStmt()
epsilonStmt in class sync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>public Field fieldWildCard()
fieldWildCard in class sync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>public Field exclusionFieldWildCard(Field exclusion)
exclusionFieldWildCard in class sync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>public wpds.impl.WeightedPAutomaton<Field,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>,W> getFieldAutomaton()
public wpds.impl.WeightedPAutomaton<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>,W> getCallAutomaton()
public wpds.impl.WeightedPushdownSystem<ControlFlowGraph.Edge,sync.pds.solver.nodes.INode<Val>,W> getCallPDS()
public wpds.impl.WeightedPushdownSystem<Field,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>,W> getFieldPDS()
public int getNumberOfRules()
protected boolean preventFieldTransitionAdd(wpds.impl.Transition<Field,sync.pds.solver.nodes.INode<sync.pds.solver.nodes.Node<ControlFlowGraph.Edge,Val>>> t, W weight)
preventFieldTransitionAdd in class sync.pds.solver.SyncPDSSolver<ControlFlowGraph.Edge,Val,Field,W extends wpds.impl.Weight>public Map<RegExAccessPath,W> getResultsAt(Statement stmt)
public com.google.common.collect.Table<ControlFlowGraph.Edge,RegExAccessPath,W> getResults(Method m)
public void debugFieldAutomaton(Statement stmt)
public void unregisterAllListeners()
Copyright © 2024. All rights reserved.