diff --git a/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/passes/EvaluationOrderGraphPass.kt b/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/passes/EvaluationOrderGraphPass.kt index f1a5da1377..6b043a39d2 100644 --- a/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/passes/EvaluationOrderGraphPass.kt +++ b/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/passes/EvaluationOrderGraphPass.kt @@ -35,7 +35,6 @@ import de.fraunhofer.aisec.cpg.graph.StatementHolder import de.fraunhofer.aisec.cpg.graph.declarations.* import de.fraunhofer.aisec.cpg.graph.edges.flows.EvaluationOrder import de.fraunhofer.aisec.cpg.graph.firstParentOrNull -import de.fraunhofer.aisec.cpg.graph.scopes.* import de.fraunhofer.aisec.cpg.graph.statements.* import de.fraunhofer.aisec.cpg.graph.statements.expressions.* import de.fraunhofer.aisec.cpg.graph.types.Type @@ -46,7 +45,12 @@ import java.util.* import org.slf4j.LoggerFactory /** - * Creates an Evaluation Order Graph (EOG) based on AST. + * Creates an Evaluation Order Graph (EOG) based on the CPG's version of the AST. The expected + * outcomes are specified in the + * [Specification](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog). + * + * Note: If you changed this file, make sure the specification is still in-line with the + * implementation. If you support new nodes, add a section to the specification. * * An EOG is an intra-procedural directed graph whose vertices are executable AST nodes and edges * connect them in the order they would be executed when running the program. @@ -84,7 +88,6 @@ import org.slf4j.LoggerFactory @Suppress("MemberVisibilityCanBePrivate") open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPass(ctx) { - protected val map = mutableMapOf, (Node) -> Unit>() protected var currentPredecessors = mutableListOf() protected var nextEdgeBranch: Boolean? = null @@ -99,7 +102,7 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa /** * This maps nodes that have to handle [BreakStatement]s and [ContinueStatement]s, i.e. * [LoopStatement]s and [SwitchStatement]s to the EOG exits of the node they have to handle. An - * entry will only be created if the statement was identified to handle the above mentioned + * entry will only be created if the statement was identified to handle the above-mentioned * control flow statements. */ val nodesWithContinuesAndBreaks = mutableMapOf>() @@ -117,86 +120,6 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa */ protected val intermediateNodes = mutableListOf() - init { - map[IncludeDeclaration::class.java] = { doNothing() } - map[TranslationUnitDeclaration::class.java] = { - handleTranslationUnitDeclaration(it as TranslationUnitDeclaration) - } - map[NamespaceDeclaration::class.java] = { - handleNamespaceDeclaration(it as NamespaceDeclaration) - } - map[RecordDeclaration::class.java] = { handleRecordDeclaration(it as RecordDeclaration) } - map[FunctionDeclaration::class.java] = { - handleFunctionDeclaration(it as FunctionDeclaration) - } - map[TupleDeclaration::class.java] = { handleTupleDeclaration(it as TupleDeclaration) } - map[VariableDeclaration::class.java] = { - handleVariableDeclaration(it as VariableDeclaration) - } - map[CallExpression::class.java] = { handleCallExpression(it as CallExpression) } - map[MemberExpression::class.java] = { handleMemberExpression(it as MemberExpression) } - map[SubscriptExpression::class.java] = { - handleSubscriptExpression(it as SubscriptExpression) - } - map[NewArrayExpression::class.java] = { handleNewArrayExpression(it as NewArrayExpression) } - map[RangeExpression::class.java] = { handleRangeExpression(it as RangeExpression) } - map[DeclarationStatement::class.java] = { - handleDeclarationStatement(it as DeclarationStatement) - } - map[ReturnStatement::class.java] = { handleReturnStatement(it as ReturnStatement) } - map[BinaryOperator::class.java] = { handleBinaryOperator(it as BinaryOperator) } - map[AssignExpression::class.java] = { handleAssignExpression(it as AssignExpression) } - map[UnaryOperator::class.java] = { handleUnaryOperator(it as UnaryOperator) } - map[Block::class.java] = { handleBlock(it as Block) } - map[IfStatement::class.java] = { handleIfStatement(it as IfStatement) } - map[AssertStatement::class.java] = { handleAssertStatement(it as AssertStatement) } - map[WhileStatement::class.java] = { handleWhileStatement(it as WhileStatement) } - map[DoStatement::class.java] = { handleDoStatement(it as DoStatement) } - map[ForStatement::class.java] = { handleForStatement(it as ForStatement) } - map[ForEachStatement::class.java] = { handleForEachStatement(it as ForEachStatement) } - map[TypeExpression::class.java] = { handleTypeExpression(it as TypeExpression) } - map[TryStatement::class.java] = { handleTryStatement(it as TryStatement) } - map[ContinueStatement::class.java] = { handleContinueStatement(it as ContinueStatement) } - map[DeleteExpression::class.java] = { handleDeleteExpression(it as DeleteExpression) } - map[BreakStatement::class.java] = { handleBreakStatement(it as BreakStatement) } - map[SwitchStatement::class.java] = { handleSwitchStatement(it as SwitchStatement) } - map[LabelStatement::class.java] = { handleLabelStatement(it as LabelStatement) } - map[GotoStatement::class.java] = { handleGotoStatement(it as GotoStatement) } - map[CaseStatement::class.java] = { handleCaseStatement(it as CaseStatement) } - map[SynchronizedStatement::class.java] = { - handleSynchronizedStatement(it as SynchronizedStatement) - } - map[NewExpression::class.java] = { handleNewExpression(it as NewExpression) } - map[KeyValueExpression::class.java] = { handleKeyValueExpression(it as KeyValueExpression) } - map[CastExpression::class.java] = { handleCastExpression(it as CastExpression) } - map[ExpressionList::class.java] = { handleExpressionList(it as ExpressionList) } - map[ConditionalExpression::class.java] = { - handleConditionalExpression(it as ConditionalExpression) - } - map[InitializerListExpression::class.java] = { - handleInitializerListExpression(it as InitializerListExpression) - } - map[ConstructExpression::class.java] = { - handleConstructExpression(it as ConstructExpression) - } - map[EmptyStatement::class.java] = { handleDefault(it as EmptyStatement) } - map[Literal::class.java] = { handleDefault(it) } - map[DefaultStatement::class.java] = { handleDefault(it) } - map[TypeIdExpression::class.java] = { handleDefault(it) } - map[Reference::class.java] = { handleDefault(it) } - map[CollectionComprehension::class.java] = { - handleCollectionComprehension(it as CollectionComprehension) - } - map[ComprehensionExpression::class.java] = { - handleComprehensionExpression(it as ComprehensionExpression) - } - map[LambdaExpression::class.java] = { handleLambdaExpression(it as LambdaExpression) } - map[LookupScopeStatement::class.java] = { - handleLookupScopeStatement(it as LookupScopeStatement) - } - map[ThrowExpression::class.java] = { handleThrowExpression(it as ThrowExpression) } - } - protected fun doNothing() { // Nothing to do for this node type } @@ -245,6 +168,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa } } + /** + * See + * [Specification for StatementHolder](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#statementholder) + */ protected fun handleTranslationUnitDeclaration(node: TranslationUnitDeclaration) { handleStatementHolder(node as StatementHolder) @@ -256,6 +183,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa processedListener.clearProcessed() } + /** + * See + * [Specification for StatementHolder](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#statementholder) + */ protected fun handleNamespaceDeclaration(node: NamespaceDeclaration) { handleStatementHolder(node) @@ -267,18 +198,30 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa processedListener.clearProcessed() } + /** + * See + * [Specification for VariableDeclaration](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#variabledeclaration) + */ protected fun handleVariableDeclaration(node: VariableDeclaration) { attachToEOG(node) // analyze the initializer handleEOG(node.initializer) } + /** + * See + * [Specification for TupleDeclaration](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#tupledeclaration) + */ protected fun handleTupleDeclaration(node: TupleDeclaration) { attachToEOG(node) // analyze the initializer handleEOG(node.initializer) } + /** + * See + * [Specification for StatementHolder](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#statementholder) + */ protected open fun handleRecordDeclaration(node: RecordDeclaration) { handleStatementHolder(node) currentPredecessors.clear() @@ -296,6 +239,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa } } + /** + * See + * [Specification for StatementHolder](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#statementholder) + */ protected fun handleStatementHolder(statementHolder: StatementHolder) { // separate code into static and non-static parts as they are executed in different moments, // although they can be placed in the same enclosing declaration. @@ -316,6 +263,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa currentPredecessors.clear() } + /** + * See + * [Specification for LambdaExpression](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#lambdaexpression) + */ protected fun handleLambdaExpression(node: LambdaExpression) { val tmpCurrentEOG = currentPredecessors.toMutableList() val tmpCurrentProperties = nextEdgeBranch @@ -338,6 +289,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa attachToEOG(node) } + /** + * See + * [Specification for FunctionDeclaration](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#functiondeclaration) + */ protected open fun handleFunctionDeclaration(node: FunctionDeclaration) { // reset EOG currentPredecessors.clear() @@ -387,33 +342,128 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa */ protected fun handleEOG(node: Node?) { if (node == null) { - // nothing to do return } - intermediateNodes.add(node) - var toHandle: Class<*> = node.javaClass - var callable = map[toHandle] - while (callable == null) { - toHandle = toHandle.superclass - callable = map[toHandle] - if (toHandle == Node::class.java || !Node::class.java.isAssignableFrom(toHandle)) break - } - if (callable != null) { - callable(node) - } else { - LOGGER.info("Parsing of type ${node.javaClass} is not supported (yet)") + + when (node) { + is TranslationUnitDeclaration -> handleTranslationUnitDeclaration(node) + is NamespaceDeclaration -> handleNamespaceDeclaration(node) + is RecordDeclaration -> handleRecordDeclaration(node) + is FunctionDeclaration -> handleFunctionDeclaration(node) + is TupleDeclaration -> handleTupleDeclaration(node) + is VariableDeclaration -> handleVariableDeclaration(node) + is ConstructExpression -> handleConstructExpression(node) + is CallExpression -> handleCallExpression(node) + is MemberExpression -> handleMemberExpression(node) + is SubscriptExpression -> handleSubscriptExpression(node) + is NewArrayExpression -> handleNewArrayExpression(node) + is RangeExpression -> handleRangeExpression(node) + is DeclarationStatement -> handleDeclarationStatement(node) + is ReturnStatement -> handleReturnStatement(node) + is BinaryOperator -> handleBinaryOperator(node) + is AssignExpression -> handleAssignExpression(node) + is UnaryOperator -> handleUnaryOperator(node) + is Block -> handleBlock(node) + is IfStatement -> handleIfStatement(node) + is AssertStatement -> handleAssertStatement(node) + is WhileStatement -> handleWhileStatement(node) + is DoStatement -> handleDoStatement(node) + is ForStatement -> handleForStatement(node) + is ForEachStatement -> handleForEachStatement(node) + is TypeExpression -> handleTypeExpression(node) + is TryStatement -> handleTryStatement(node) + is ContinueStatement -> handleContinueStatement(node) + is DeleteExpression -> handleDeleteExpression(node) + is BreakStatement -> handleBreakStatement(node) + is SwitchStatement -> handleSwitchStatement(node) + is LabelStatement -> handleLabelStatement(node) + is GotoStatement -> handleGotoStatement(node) + is CaseStatement -> handleCaseStatement(node) + is SynchronizedStatement -> handleSynchronizedStatement(node) + is NewExpression -> handleNewExpression(node) + is KeyValueExpression -> handleKeyValueExpression(node) + is CastExpression -> handleCastExpression(node) + is ExpressionList -> handleExpressionList(node) + is ConditionalExpression -> handleConditionalExpression(node) + is InitializerListExpression -> handleInitializerListExpression(node) + is CollectionComprehension -> handleCollectionComprehension(node) + is ComprehensionExpression -> handleComprehensionExpression(node) + is LambdaExpression -> handleLambdaExpression(node) + is LookupScopeStatement -> handleLookupScopeStatement(node) + is ThrowExpression -> handleThrowExpression(node) + // These nodes will be added to the eog graph but no children will be handled + is EmptyStatement -> handleDefault(node) + is Literal<*> -> handleDefault(node) + is DefaultStatement -> handleDefault(node) + is TypeIdExpression -> handleDefault(node) + is Reference -> handleDefault(node) + // These nodes are not added to the EOG + is IncludeDeclaration -> doNothing() + else -> LOGGER.info("Parsing of type ${node.javaClass} is not supported (yet)") } } /** - * Default handler for nodes. The node is simply attacked to the EOG and the ast subtree is + * Default handler for nodes. The node is simply attached to the EOG and the ast subtree is * ignored. */ protected fun handleDefault(node: Node) { attachToEOG(node) } + /** + * See + * [Specification for EmptyStatement](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#emptystatement) + */ + private fun handleEmptyStatement(node: EmptyStatement) { + attachToEOG(node) + } + + /** + * See + * [Specification for Literal](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#literal) + */ + private fun handleLiteral(node: Literal<*>) { + attachToEOG(node) + } + + /** + * See + * [Specification for DefaultStatement](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#defaultstatement) + */ + private fun handleDefaultStatement(node: DefaultStatement) { + attachToEOG(node) + } + + /** + * See + * [Specification for TypeIdExpression](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#typeidexpression) + */ + private fun handleTypeIdExpression(node: TypeIdExpression) { + attachToEOG(node) + } + + /** + * See + * [Specification for Reference](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#reference) + */ + private fun handleReference(node: Reference) { + attachToEOG(node) + } + + /** + * See + * [Specification for IncludeDeclaration](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#includedeclaration) + */ + protected fun handleIncludeDeclaration() { + doNothing() + } + + /** + * See + * [Specification for CallExpression](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#callexpression) + */ protected fun handleCallExpression(node: CallExpression) { // Todo add call as throwexpression to outer scope of call can throw (which is trivial to // find out for java, but impossible for c++) @@ -429,11 +479,19 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa attachToEOG(node) } + /** + * See + * [Specification for MemberExpression](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#memberexpression) + */ protected fun handleMemberExpression(node: MemberExpression) { handleEOG(node.base) attachToEOG(node) } + /** + * See + * [Specification for SubscriptExpression](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#subscriptexpression) + */ protected fun handleSubscriptExpression(node: SubscriptExpression) { // Connect according to evaluation order, first the array reference, then the contained // index. @@ -442,6 +500,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa attachToEOG(node) } + /** + * See + * [Specification for NewArrayExpression](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#newarrayexpression) + */ protected fun handleNewArrayExpression(node: NewArrayExpression) { for (dimension in node.dimensions) { handleEOG(dimension) @@ -450,6 +512,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa attachToEOG(node) } + /** + * See + * [Specification for RangeExpression](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#rangeexpression) + */ protected fun handleRangeExpression(node: RangeExpression) { handleEOG(node.floor) handleEOG(node.ceiling) @@ -457,6 +523,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa attachToEOG(node) } + /** + * See + * [Specification for DeclarationStatement](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#declarationexpression) + */ protected fun handleDeclarationStatement(node: DeclarationStatement) { // loop through declarations for (declaration in node.declarations) { @@ -482,6 +552,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa attachToEOG(node) } + /** + * See + * [Specification for ReturnStatement](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#returnstatement) + */ protected fun handleReturnStatement(node: ReturnStatement) { // analyze the return value handleEOG(node.returnValue) @@ -489,16 +563,20 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa // push the statement itself attachToEOG(node) - // reset the state afterwards, we're done with this function + // reset the state afterward, we're done with this function currentPredecessors.clear() } + /** + * See + * [Specification for BinaryOperator](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#binaryoperator) + */ protected fun handleBinaryOperator(node: BinaryOperator) { handleEOG(node.lhs) val lang = node.language // Two operators that don't evaluate the second operator if the first evaluates to a certain // value. If the language has the trait of short-circuit evaluation, we check if the - // operatorCode is amongst the operators that leed such an evaluation. + // operatorCode is amongst the operators that lead to such an evaluation. if ( lang != null && lang is HasShortCircuitOperators && @@ -515,7 +593,7 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa handleEOG(node.rhs) attachToEOG(node) setCurrentEOGs(shortCircuitNodes) - // Inverted property to assigne false when true was assigned above. + // Inverted property to assign false when true was assigned above. nextEdgeBranch = !lang.conjunctiveOperators.contains(node.operatorCode) } else { handleEOG(node.rhs) @@ -523,6 +601,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa attachToEOG(node) } + /** + * See + * [Specification for AssignExpression](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#assignexpression) + */ protected fun handleAssignExpression(node: AssignExpression) { for (declaration in node.declarations) { handleEOG(declaration) @@ -542,6 +624,9 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa attachToEOG(node) } + /** + * See [Specification for Block](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#block) + */ protected fun handleBlock(node: Block) { // analyze the contained statements @@ -551,6 +636,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa attachToEOG(node) } + /** + * See + * [Specification for UnaryOperator](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#unaryoperator) + */ protected fun handleUnaryOperator(node: UnaryOperator) { handleUnspecificUnaryOperator(node) } @@ -558,8 +647,8 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa /** * This function handles all regular unary operators that do not receive any special handling * (such as [handleThrowOperator]). This gives language frontends a chance to override this - * function using [ReplacePass], handle specific operators on their own and delegate the rest to - * this function. + * function using [de.fraunhofer.aisec.cpg.passes.configuration.ReplacePass], handle specific + * operators on their own and delegate the rest to this function. */ protected open fun handleUnspecificUnaryOperator(node: UnaryOperator) { val input = node.input @@ -568,6 +657,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa attachToEOG(node) } + /** + * See + * [Specification fir AssertStatement](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#assertstatement) + */ protected fun handleAssertStatement(node: AssertStatement) { handleEOG(node.condition) val openConditionEOGs = currentPredecessors.toMutableList() @@ -576,10 +669,18 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa attachToEOG(node) } + /** + * See + * [Specification for TypeExpression](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#typeexpression) + */ protected fun handleTypeExpression(node: TypeExpression) { attachToEOG(node) } + /** + * See + * [Specification for TryStatement](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#trystatement) + */ protected fun handleTryStatement(node: TryStatement) { node.resources.forEach { handleEOG(it) } @@ -666,6 +767,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa attachToEOG(node) } + /** + * See + * [Specification for ContinueStatement](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#continuestatement) + */ protected fun handleContinueStatement(node: ContinueStatement) { attachToEOG(node) val label = node.label @@ -673,8 +778,8 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa if (label == null) { node.firstParentOrNull { it.isContinuable() } } else { - // If a label was specified, the continue is associated to a node explicitly labeled - // with the same label + // If a label was specified, the continue statement is associated to a node + // explicitly labeled with the same label getLabeledASTNode(node, label) } if (continuableNode != null) { @@ -690,6 +795,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa currentPredecessors.clear() } + /** + * See + * [Specification for DeleteExpression](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#deleteexpression) + */ protected fun handleDeleteExpression(node: DeleteExpression) { for (operand in node.operands) { handleEOG(operand) @@ -697,6 +806,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa attachToEOG(node) } + /** + * See + * [Specification for BreakStatement](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#breakstatement) + */ protected fun handleBreakStatement(node: BreakStatement) { attachToEOG(node) val label = node.label @@ -717,11 +830,19 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa currentPredecessors.clear() } + /** + * See + * [Specification for LabelStatement](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#labelstatement) + */ protected fun handleLabelStatement(node: LabelStatement) { node.scope?.addLabelStatement(node) handleEOG(node.subStatement) } + /** + * See + * [Specification for GotoStatement](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#gotostatement) + */ protected fun handleGotoStatement(node: GotoStatement) { attachToEOG(node) node.targetLabel?.let { @@ -730,27 +851,47 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa currentPredecessors.clear() } + /** + * See + * [Specification for CaseStatement](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#casestatement) + */ protected fun handleCaseStatement(node: CaseStatement) { handleEOG(node.caseExpression) attachToEOG(node) } + /** + * See + * [Specification for NewExpression](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#newexpression) + */ protected fun handleNewExpression(node: NewExpression) { handleEOG(node.initializer) attachToEOG(node) } + /** + * See + * [Specification for KeyValueExpression](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#keyvalueexpression) + */ protected fun handleKeyValueExpression(node: KeyValueExpression) { handleEOG(node.key) handleEOG(node.value) attachToEOG(node) } + /** + * See + * [Specification for CastExpression](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#castexpression) + */ protected fun handleCastExpression(node: CastExpression) { handleEOG(node.expression) attachToEOG(node) } + /** + * See + * [Specification for ExpressionList](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#expressionlist) + */ protected fun handleExpressionList(node: ExpressionList) { for (expr in node.expressions) { handleEOG(expr) @@ -758,6 +899,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa attachToEOG(node) } + /** + * See + * [Specification for InitializerListExpression](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#initializerlistexpression) + */ protected fun handleInitializerListExpression(node: InitializerListExpression) { // first the arguments for (inits in node.initializers) { @@ -766,6 +911,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa attachToEOG(node) } + /** + * See + * [Specification for ConstructExpression](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#constructexpression) + */ protected fun handleConstructExpression(node: ConstructExpression) { // first the arguments for (arg in node.arguments) { @@ -871,12 +1020,20 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa prevs.forEach { prev -> addEOGEdge(prev, next) } } + /** + * See + * [Specification for SynchronizedStatement](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#synchronizedstatement) + */ protected fun handleSynchronizedStatement(node: SynchronizedStatement) { handleEOG(node.expression) attachToEOG(node) handleEOG(node.block) } + /** + * See + * [Specification for ConditionalExpression](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#conditionalexpression) + */ protected fun handleConditionalExpression(node: ConditionalExpression) { val openBranchNodes = mutableListOf() handleEOG(node.condition) @@ -893,6 +1050,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa setCurrentEOGs(openBranchNodes) } + /** + * See + * [Specification for DoStatement](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#dostatement) + */ protected fun handleDoStatement(node: DoStatement) { handleEOG(node.statement) handleEOG(node.condition) @@ -906,6 +1067,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa handleContainedBreaksAndContinues(node) } + /** + * See + * [Specification for ComprehensionExpression](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#comprehensionexpression) + */ private fun handleComprehensionExpression(node: ComprehensionExpression) { handleEOG(node.iterable) // When the iterable contains another element, the variable is evaluated with the @@ -923,6 +1088,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa nextEdgeBranch = true } + /** + * See + * [Specification for CollectionComprehension](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#collectioncomprehension) + */ private fun handleCollectionComprehension(node: CollectionComprehension) { // Process the comprehension expressions from 0 to n and connect the EOG of i to i+1. var prevComprehensionExpression: ComprehensionExpression? = null @@ -960,6 +1129,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa attachToEOG(node) } + /** + * See + * [Specification for ForEachStatement](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#foreachstatement) + */ protected fun handleForEachStatement(node: ForEachStatement) { handleEOG(node.iterable) handleEOG(node.variable) @@ -977,6 +1150,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa nextEdgeBranch = false } + /** + * See + * [Specification for ForStatement](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#forstatement) + */ protected fun handleForStatement(node: ForStatement) { handleEOG(node.initializerStatement) handleEOG(node.conditionDeclaration) @@ -998,6 +1175,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa nextEdgeBranch = false } + /** + * See + * [Specification for IfStatement](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#ifstatement) + */ protected fun handleIfStatement(node: IfStatement) { val openBranchNodes = mutableListOf() handleEOG(node.initializerStatement) @@ -1019,6 +1200,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa setCurrentEOGs(openBranchNodes) } + /** + * See + * [Specification for SwitchStatement](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#switchstatement) + */ protected fun handleSwitchStatement(node: SwitchStatement) { handleEOG(node.initializerStatement) handleEOG(node.selectorDeclaration) @@ -1051,6 +1236,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa currentPredecessors.addAll(nodesWithContinuesAndBreaks[node] ?: mutableListOf()) } + /** + * See + * [Specification for WhileStatement](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#whilestatement) + */ protected fun handleWhileStatement(node: WhileStatement) { handleEOG(node.conditionDeclaration) handleEOG(node.condition) @@ -1068,6 +1257,10 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa handleContainedBreaksAndContinues(node) } + /** + * See + * [Specification for LookupScopeStatement](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#lookupScopestatement) + */ private fun handleLookupScopeStatement(stmt: LookupScopeStatement) { // Include the node as part of the EOG itself, but we do not need to go into any children or // properties here @@ -1084,7 +1277,12 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa return null } - /** Calls [handleThrowOperator]. */ + /** + * Calls [handleThrowOperator]. + * + * See + * [Specification for ThrowExpression](https://fraunhofer-aisec.github.io/cpg/CPG/specs/eog/#throwexpression) + */ protected fun handleThrowExpression(throwExpression: ThrowExpression) { handleThrowOperator( throwExpression, diff --git a/docs/docs/CPG/specs/eog.md b/docs/docs/CPG/specs/eog.md index 488189cde8..5c3a662a4d 100644 --- a/docs/docs/CPG/specs/eog.md +++ b/docs/docs/CPG/specs/eog.md @@ -860,8 +860,97 @@ flowchart LR ``` +## TypeExpression +The expression itself is connected to the outer EOG. +Interesting fields: / +Scheme: +```mermaid +flowchart LR + classDef outer fill:#fff,stroke:#ddd,stroke-dasharray:5 5; + prev:::outer --EOG--> parent["TypeExpression"] + parent --EOG--> next:::outer +``` - +## LookupScopeStatement +The statement itself is connected to the outer EOG. + +Interesting fields: / + +Scheme: +```mermaid +flowchart LR + classDef outer fill:#fff,stroke:#ddd,stroke-dasharray:5 5; + prev:::outer --EOG--> parent["LookupScopeStatement"] + parent --EOG--> next:::outer +``` + +## EmptyStatement +The statement itself is connected to the outer EOG. + +Interesting fields: / + +Scheme: +```mermaid +flowchart LR + classDef outer fill:#fff,stroke:#ddd,stroke-dasharray:5 5; + prev:::outer --EOG--> parent["EmptyStatement"] + parent --EOG--> next:::outer +``` + +## Literal +The statement itself is connected to the outer EOG. + +Interesting fields: / + +Scheme: +```mermaid +flowchart LR + classDef outer fill:#fff,stroke:#ddd,stroke-dasharray:5 5; + prev:::outer --EOG--> parent["Literal"] + parent --EOG--> next:::outer +``` + +## DefaultStatement +The statement itself is connected to the outer EOG. + +Interesting fields: / + +Scheme: +```mermaid +flowchart LR + classDef outer fill:#fff,stroke:#ddd,stroke-dasharray:5 5; + prev:::outer --EOG--> parent["DefaultStatement"] + parent --EOG--> next:::outer +``` + +## TypeIdExpression +The statement itself is connected to the outer EOG. + +Interesting fields: / + +Scheme: +```mermaid +flowchart LR + classDef outer fill:#fff,stroke:#ddd,stroke-dasharray:5 5; + prev:::outer --EOG--> parent["TypeIdExpression"] + parent --EOG--> next:::outer +``` + +## Reference +The statement itself is connected to the outer EOG. + +Interesting fields: / + +Scheme: +```mermaid +flowchart LR + classDef outer fill:#fff,stroke:#ddd,stroke-dasharray:5 5; + prev:::outer --EOG--> parent["Reference"] + parent --EOG--> next:::outer +``` +## IncludeDeclaration +The `IncludeDeclaration` is not connected to the EOG. +We continue with the next statement.