abstract class XTypeRecovery[CompilationUnitType <: AstNode](cpg: Cpg, iterations: Int) extends CpgPass
Based on a flow-insensitive symbol-table-style approach. This pass aims to be fast and deterministic and does not
try to converge to some fixed point but rather iterates a fixed number of times. This will help recover:
Imported call signatures from external dependencies
Dynamic type hints for mutable variables in a
compilation unit.
The algorithm flows roughly as follows:
Scan for method signatures of methods for each compilation unit,
either by internally defined methods or by reading import signatures. This includes looking for aliases, e.g. import
foo as bar.
(Optionally) Prune these method signatures by checking their validity against the
CPG.
Visit assignments to populate where variables are assigned a value to extrapolate its type. Store these
values in a local symbol table. If a field is assigned a value, store this in the global table
Find
instances of where these fields and 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.
In order to propagate types across compilation units, but avoid the poor scalability of a fixed-point algorithm, the
number of iterations can be configured using the iterations parameter. Note that iterations < 2 will not
provide any interprocedural type recovery capabilities.
The symbol tables use the SymbolTable class to track possible type information. Note: Local symbols
are cleared once a compilation unit is complete. This is to keep memory usage down while maximizing
concurrency.
Attributes
CompilationUnitType
the AstNode type used to represent a compilation unit of the language.
cpg
the CPG to recovery types for.
iterations
the total number of iterations through which types are to be propagated. At least 2 are recommended in order to
propagate interprocedural types. Think of this as similar to the dataflowengineoss' 'maxCallDepth'.
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.
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.