XTypeRecovery

io.joern.x2cpg.passes.frontend.XTypeRecovery
abstract class XTypeRecovery(cpg: Cpg) extends CpgPass

Based on a flow-insensitive symbol-table-style approach. This does not accurately determine the difference between shadowed variables in the same file but this is due to REF edges not connecting children methods to parent scope (yet).

The algorithm flows roughly as follows:

  • Scan the CPG for method signatures of methods which are in scope of each compilation unit, either by internally defined methods or by reading import signatures. This includes looking for aliases, e.g. import foo as bar. Store these details in the global table
  • TODO: While performing the above, note field/member assignments in the global table.
  • (Optionally) Prune these method signatures by checking their validity against the CPG.
  • Visit each compilation unit and:
  • Visit assignments to populate where variables are assigned a value to extrapolate its type. Store these values in a local symbol table.
  • Find instances of where these variables are used and update their type information.
  • If this variable is the receiver of a call, make sure to set the type of the call accordingly.

The global and local symbol tables use the SymbolTable class to track possible type information.

Attributes

Graph
Supertypes
class CpgPass
class ForkJoinParallelCpgPass[AnyRef]
class NewStyleCpgPassBase[AnyRef]
trait CpgPassBase
class Object
trait Matchable
class Any
Known subtypes

Members list

Concise view

Type members

Inherited types

type DiffGraphBuilder = DiffGraphBuilder

Attributes

Inherited from:
NewStyleCpgPassBase

Value members

Abstract methods

def generateRecoveryForCompilationUnitTask(unit: AstNode, builder: DiffGraphBuilder, globalTable: SymbolTable): RecoverForXCompilationUnit

A factory method to generate a RecoverForXCompilationUnit task with the given parameters.

A factory method to generate a RecoverForXCompilationUnit task with the given parameters.

Attributes

builder

the graph builder.

globalTable

the global table.

unit

the compilation unit.

Returns:

a forkable RecoverForXCompilationUnit task.

Generates a task to create an import task.

Generates a task to create an import task.

Attributes

globalTable

the global table.

node

the import node or method definition node.

Returns:

a forkable SetXProcedureDefTask task.

def importNodes: Traversal[CfgNode]

Attributes

Returns:

the import nodes of this CPG.

Concrete methods

def postVisitImports(): Unit

The initial import setting is over-approximated, so this step checks the CPG for any matches and prunes against these findings. If there are no findings, it will leave the table as is. The latter is significant for external types or methods.

The initial import setting is over-approximated, so this step checks the CPG for any matches and prunes against these findings. If there are no findings, it will leave the table as is. The latter is significant for external types or methods.

Attributes

override def run(builder: DiffGraphBuilder): Unit

Attributes

Definition Classes
CpgPass

Inherited methods

override def createAndApply(): Unit

Attributes

Definition Classes
NewStyleCpgPassBase -> CpgPassBase
Inherited from:
NewStyleCpgPassBase
override def createApplySerializeAndStore(serializedCpg: SerializedCpg, inverse: Boolean, prefix: String): Unit

Attributes

Definition Classes
ForkJoinParallelCpgPass -> CpgPassBase
Inherited from:
ForkJoinParallelCpgPass
def finish(): Unit

Attributes

Inherited from:
NewStyleCpgPassBase
final override def generateParts(): Array[_ <: AnyRef]

Attributes

Definition Classes
CpgPass -> NewStyleCpgPassBase
Inherited from:
CpgPass
def init(): Unit

Attributes

Inherited from:
NewStyleCpgPassBase
def name: String

Name of the pass. By default it is inferred from the name of the class, override if needed.

Name of the pass. By default it is inferred from the name of the class, override if needed.

Attributes

Inherited from:
CpgPassBase
final override def runOnPart(builder: DiffGraphBuilder, part: AnyRef): Unit

Attributes

Definition Classes
CpgPass -> NewStyleCpgPassBase
Inherited from:
CpgPass
override def runWithBuilder(externalBuilder: DiffGraphBuilder): Int

Runs the cpg pass, adding changes to the passed builder. Use with caution -- API is unstable. Returns max(nParts, 1), where nParts is either the number of parallel parts, or the number of iterarator elements in case of legacy passes. Includes init() and finish() logic.

Runs the cpg pass, adding changes to the passed builder. Use with caution -- API is unstable. Returns max(nParts, 1), where nParts is either the number of parallel parts, or the number of iterarator elements in case of legacy passes. Includes init() and finish() logic.

Attributes

Definition Classes
NewStyleCpgPassBase -> CpgPassBase
Inherited from:
NewStyleCpgPassBase
def runWithBuilderLogged(builder: DiffGraphBuilder): Int

Wraps runWithBuilder with logging, and swallows raised exceptions. Use with caution -- API is unstable. A return value of -1 indicates failure, otherwise the return value of runWithBuilder is passed through.

Wraps runWithBuilder with logging, and swallows raised exceptions. Use with caution -- API is unstable. A return value of -1 indicates failure, otherwise the return value of runWithBuilder is passed through.

Attributes

Inherited from:
CpgPassBase

Concrete fields

protected val globalTable: SymbolTable

Stores all interprocedural information, e.g., method signatures, field types, etc.

Stores all interprocedural information, e.g., method signatures, field types, etc.

Attributes