public class CallGraphWalker
extends java.lang.Object
Modifier and Type | Field and Description |
---|---|
static int |
MAX_DEPTH_DEFAULT
Call graph strands are no longer explored after a maximum distance from the original root.
|
static int |
MAX_WIDTH_DEFAULT
Once the call graph reaches a maximum width, no more nodes are added to the worklist of the
next level.
|
Constructor and Description |
---|
CallGraphWalker() |
Modifier and Type | Method and Description |
---|---|
static java.util.Set<MethodSignature> |
getPredecessors(CallGraph callGraph,
MethodSignature start)
Like
getPredecessors(CallGraph, MethodSignature, int, int) but using default values
for max depth and max width. |
static java.util.Set<MethodSignature> |
getPredecessors(CallGraph callGraph,
MethodSignature start,
int maxDepth,
int maxWidth)
Inverse of
getSuccessors(CallGraph, MethodSignature) : Starting from one particular
method, all methods that can transitively reach it are collected in a single set. |
static java.util.Set<MethodSignature> |
getSuccessors(CallGraph callGraph,
MethodSignature start)
Like
getSuccessors(CallGraph, MethodSignature, int, int) but using default values for
max depth and max width. |
static java.util.Set<MethodSignature> |
getSuccessors(CallGraph callGraph,
MethodSignature start,
int maxDepth,
int maxWidth)
Analogous to Soot's
getReachableMethods() : Starting from one particular method,
all methods that are transitively reachable are collected in a single set. |
static Node |
predecessorPathsAccept(CallGraph callGraph,
MethodSignature start,
java.util.function.Predicate<Node> handler)
Like
predecessorPathsAccept(CallGraph, MethodSignature, Predicate, int, int) but using
default values for max depth and max width. |
static Node |
predecessorPathsAccept(CallGraph callGraph,
MethodSignature start,
java.util.function.Predicate<Node> handler,
int maxDepth,
int maxWidth)
Interactively explore the incoming call graph (breadth-first) of a specific method.
|
static Node |
successorPathsAccept(CallGraph callGraph,
MethodSignature start,
java.util.function.Predicate<Node> handler)
Like
successorPathsAccept(CallGraph, MethodSignature, Predicate, int, int) but using
default values for max depth and max width. |
static Node |
successorPathsAccept(CallGraph callGraph,
MethodSignature start,
java.util.function.Predicate<Node> handler,
int maxDepth,
int maxWidth)
Interactively explore the outgoing call graph (breadth-first) of a specific method.
|
public static final int MAX_DEPTH_DEFAULT
public static final int MAX_WIDTH_DEFAULT
level2_0 <-- level1_0 <-- root
level2_1 <------| |
level2_2 <------| |
|
level2_3 <-- level1_1 <----|
level2_4 <------|
If level1_1
has any more known predecessors, level 2 of the call graph would have
width 6, which is more than the 5 allowed nodes. Thus, level1_1
is marked as
truncated and its other predecessors are discarded.public static java.util.Set<MethodSignature> getSuccessors(CallGraph callGraph, MethodSignature start, int maxDepth, int maxWidth)
getReachableMethods()
: Starting from one particular method,
all methods that are transitively reachable are collected in a single set. The exploration
stops after no more reachable methods have been found, or the reachable call graph exceeds
MAX_DEPTH_DEFAULT
and MAX_WIDTH_DEFAULT
.callGraph
- The CallGraph
to use as the basis for this explorationstart
- The method that is to be used as the exploration rootmaxDepth
- See MAX_DEPTH_DEFAULT
maxWidth
- See MAX_WIDTH_DEFAULT
public static java.util.Set<MethodSignature> getSuccessors(CallGraph callGraph, MethodSignature start)
getSuccessors(CallGraph, MethodSignature, int, int)
but using default values for
max depth and max width.callGraph
- The CallGraph
to use as the basis for this explorationstart
- The method that is to be used as the exploration rootpublic static java.util.Set<MethodSignature> getPredecessors(CallGraph callGraph, MethodSignature start, int maxDepth, int maxWidth)
getSuccessors(CallGraph, MethodSignature)
: Starting from one particular
method, all methods that can transitively reach it are collected in a single set. The
exploration stops after no more incoming methods have been found, or the inversely-reachable
call graph exceeds MAX_DEPTH_DEFAULT
and MAX_WIDTH_DEFAULT
.callGraph
- The CallGraph
to use as the basis for this explorationstart
- The method that is to be used as the exploration rootmaxDepth
- See MAX_DEPTH_DEFAULT
maxWidth
- See MAX_WIDTH_DEFAULT
public static java.util.Set<MethodSignature> getPredecessors(CallGraph callGraph, MethodSignature start)
getPredecessors(CallGraph, MethodSignature, int, int)
but using default values
for max depth and max width.callGraph
- The CallGraph
to use as the basis for this explorationstart
- The method that is to be used as the exploration rootpublic static Node successorPathsAccept(CallGraph callGraph, MethodSignature start, java.util.function.Predicate<Node> handler, int maxDepth, int maxWidth)
Outgoing call graph edges are transitively visited, one level of the call graph at a time. E.g. if we have the following graph:
level2_0 <-- level1_0 <-- root
level2_1 <------| |
level2_2 <------| |
|
level2_3 <-- level1_1 <----|
level2_4 <------|
In this case, level1_0
and level1_1
are visited first, then
level2_*
and so on. The user of this method provides a callback that will be executed
for every newly visited path. This handler receives a Node
that represents e.g.
level2_1
and contains references to all its predecessors that have been visited in this
particular path. Like this, the user can evaluate the whole call chain that led to any specific
method being reachable from the starting point. Graph limits MAX_DEPTH_DEFAULT
and
MAX_WIDTH_DEFAULT
are applicable. Any paths that are truncated due to any limit being
reached, are marked with Node.isTruncated
If you are only interested in which methods are reachable from a start method, but do not
care about the individual paths that make this possible, you should use getSuccessors(CallGraph, MethodSignature)
instead.
callGraph
- The CallGraph
to use as the basis of this explorationstart
- The method that is to be used as the exploration roothandler
- The callback function that is invoked for newly visited paths. If this returns
false, this specific path is not explored any further, without marking it as truncated.maxDepth
- See MAX_DEPTH_DEFAULT
maxWidth
- See MAX_WIDTH_DEFAULT
Node
representing the start method and all its successorspublic static Node successorPathsAccept(CallGraph callGraph, MethodSignature start, java.util.function.Predicate<Node> handler)
successorPathsAccept(CallGraph, MethodSignature, Predicate, int, int)
but using
default values for max depth and max width.callGraph
- The CallGraph
to use as the basis of this explorationstart
- The method that is to be used as the exploration roothandler
- The callback function that is invoked for newly visited paths. If this returns
false, this specific path is not explored any further, without marking it as truncated.Node
representing the start method and all its successorspublic static Node predecessorPathsAccept(CallGraph callGraph, MethodSignature start, java.util.function.Predicate<Node> handler, int maxDepth, int maxWidth)
Inverse of successorPathsAccept(CallGraph, MethodSignature, Predicate)
: Explores
all methods that can reach the starting point and notifies the user's handler of newly found
paths.
callGraph
- The CallGraph
to use as the basis of this explorationstart
- The method that is to be used as the exploration roothandler
- The callback function that is invoked for newly visited paths. If this returns
false, this specific path is not explored any further, without marking it as truncated.maxDepth
- See MAX_DEPTH_DEFAULT
maxWidth
- See MAX_WIDTH_DEFAULT
Node
representing the start method and all its predecessorspublic static Node predecessorPathsAccept(CallGraph callGraph, MethodSignature start, java.util.function.Predicate<Node> handler)
predecessorPathsAccept(CallGraph, MethodSignature, Predicate, int, int)
but using
default values for max depth and max width.callGraph
- The CallGraph
to use as the basis of this explorationstart
- The method that is to be used as the exploration roothandler
- The callback function that is invoked for newly visited paths. If this returns
false, this specific path is not explored any further, without marking it as truncated.Node
representing the start method and all its predecessors