Package de.fraunhofer.aisec.cpg.passes
Class EvaluationOrderGraphPass
java.lang.Object
de.fraunhofer.aisec.cpg.passes.Pass
de.fraunhofer.aisec.cpg.passes.EvaluationOrderGraphPass
- All Implemented Interfaces:
java.util.function.Consumer<TranslationResult>
public class EvaluationOrderGraphPass extends Pass
Creates an Evaluation Order Graph (EOG) based on AST.
An EOG is an intraprocedural directed graph whose vertices are executable AST nodes and edges connect them in the order they would be executed when running the program.
An EOG always starts at the header of a method/function and ends in one (virtual) or multiple return statements. A virtual return statement with a code location of (-1,-1) is used if the actual source code does not have an explicit return statement.
The EOG is similar to the CFG ControlFlowGraphPass, but there are some subtle
differences:
- For methods without explicit return statement, EOF will have an edge to a virtual return node with line number -1 which does not exist in the original code. A CFG will always end with the last reachable statement(s) and not insert any virtual return statements.
- EOG considers an opening blocking ("CompoundStatement", indicated by a "{") as a separate node. A CFG will rather use the first actual executable statement within the block.
- For IF statements, EOG treats the "if" keyword and the condition as separate nodes. CFG treats this as one "if" statement.
- EOG considers a method header as a node. CFG will consider the first executable statement of the methods as a node.
-
Field Summary
Fields Modifier and Type Field Description protected java.util.Map<java.lang.Class<? extends de.fraunhofer.aisec.cpg.graph.Node>,CallableInterface<? extends de.fraunhofer.aisec.cpg.graph.Node>>map -
Constructor Summary
Constructors Constructor Description EvaluationOrderGraphPass() -
Method Summary
Modifier and Type Method Description voidaccept(TranslationResult result)voidaddEOGEdge(de.fraunhofer.aisec.cpg.graph.Node prev, de.fraunhofer.aisec.cpg.graph.Node next)Builds an EOG edge from prev to next.voidaddMultipleIncomingEOGEdges(java.util.List<de.fraunhofer.aisec.cpg.graph.Node> prevs, de.fraunhofer.aisec.cpg.graph.Node next)voidaddToCurrentEOG(java.util.List<de.fraunhofer.aisec.cpg.graph.Node> nodes)static booleancheckEOGInvariant(de.fraunhofer.aisec.cpg.graph.Node n)Checks if every node that has another node in its next or previous EOG List is also contained in that nodes previous or next EOG list to ensure the bidirectionality of the relation in both lists.voidcleanup()voidconnectCurrentToLoopStart()Connects current EOG nodes to the previously saved loop start to mimic control flow of loopsvoidcreateEOG(@Nullable de.fraunhofer.aisec.cpg.graph.Node node)voidexitLoop(@NonNull Statement loopStatement, @NonNull LoopScope loopScope)Connects the current EOG leaf nodes to the last stacked node, e.g.java.util.List<de.fraunhofer.aisec.cpg.graph.Node>getCurrentEOG()voidpushToEOG(@NonNull de.fraunhofer.aisec.cpg.graph.Node node)Creates an EOG-edge between the given argument node and the saved currentEOG Edges.voidsetCurrentEOG(de.fraunhofer.aisec.cpg.graph.Node node)voidsetCurrentEOG(java.util.List<de.fraunhofer.aisec.cpg.graph.Node> currentEOG)<T extends de.fraunhofer.aisec.cpg.graph.Node>
voidsetCurrentEOGs(java.util.List<T> nodes)Methods inherited from class de.fraunhofer.aisec.cpg.passes.Pass
getLang, setLang, supportsLanguageFrontendMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface java.util.function.Consumer
andThen
-
Field Details
-
map
protected final java.util.Map<java.lang.Class<? extends de.fraunhofer.aisec.cpg.graph.Node>,CallableInterface<? extends de.fraunhofer.aisec.cpg.graph.Node>> map
-
-
Constructor Details
-
EvaluationOrderGraphPass
public EvaluationOrderGraphPass()
-
-
Method Details
-
cleanup
public void cleanup() -
accept
-
checkEOGInvariant
public static boolean checkEOGInvariant(de.fraunhofer.aisec.cpg.graph.Node n)Checks if every node that has another node in its next or previous EOG List is also contained in that nodes previous or next EOG list to ensure the bidirectionality of the relation in both lists.- Parameters:
n-- Returns:
-
createEOG
public void createEOG(@Nullable de.fraunhofer.aisec.cpg.graph.Node node) -
pushToEOG
public void pushToEOG(@NonNull de.fraunhofer.aisec.cpg.graph.Node node)Creates an EOG-edge between the given argument node and the saved currentEOG Edges.- Parameters:
node- node that gets the incoming edge
-
getCurrentEOG
public java.util.List<de.fraunhofer.aisec.cpg.graph.Node> getCurrentEOG() -
setCurrentEOG
public void setCurrentEOG(java.util.List<de.fraunhofer.aisec.cpg.graph.Node> currentEOG) -
setCurrentEOG
public void setCurrentEOG(de.fraunhofer.aisec.cpg.graph.Node node) -
setCurrentEOGs
public <T extends de.fraunhofer.aisec.cpg.graph.Node> void setCurrentEOGs(java.util.List<T> nodes) -
addToCurrentEOG
public void addToCurrentEOG(java.util.List<de.fraunhofer.aisec.cpg.graph.Node> nodes) -
exitLoop
Connects the current EOG leaf nodes to the last stacked node, e.g. loop head, and removes the nodes.- Parameters:
loopStatement- the loop statementloopScope- the loop scope
-
connectCurrentToLoopStart
public void connectCurrentToLoopStart()Connects current EOG nodes to the previously saved loop start to mimic control flow of loops -
addEOGEdge
public void addEOGEdge(de.fraunhofer.aisec.cpg.graph.Node prev, de.fraunhofer.aisec.cpg.graph.Node next)Builds an EOG edge from prev to next. 'eogDirection' defines how the node instances save the references constituting the edge. 'FORWARD': only the nodes nextEOG member contains references, an points to the next nodes. 'BACKWARD': only the nodes prevEOG member contains references and points to the previous nodes. 'BIDIRECTIONAL': nextEOG and prevEOG contain references and point to the previous and the next nodes.- Parameters:
prev- the previous nodenext- the next node
-
addMultipleIncomingEOGEdges
public void addMultipleIncomingEOGEdges(java.util.List<de.fraunhofer.aisec.cpg.graph.Node> prevs, de.fraunhofer.aisec.cpg.graph.Node next)
-