DynamicCallLinker

class DynamicCallLinker(cpg: Cpg) extends SimpleCpgPass

We compute the set of possible call-targets for each dynamic call, and add them as CALL edges to the graph, based on call.methodFullName, method.name and method.signature, the inheritance hierarchy and the AST of typedecls and methods.

This pass intentionally ignores the vtable mechanism based on BINDING nodes but does check for an existing call edge before adding one. It assumes non-circular inheritance, on pain of endless recursion / stack overflow.

Based on the algorithm by Jang, Dongseok & Tatlock, Zachary & Lerner, Sorin. (2014). SAFEDISPATCH: Securing C++ Virtual Calls from Memory Corruption Attacks. 10.14722/ndss.2014.23287.

Companion:
object
class SimpleCpgPass
class ForkJoinParallelCpgPass[AnyRef]
class NewStyleCpgPassBase[AnyRef]
trait CpgPassBase
class Object
trait Matchable
class Any

Type members

Inherited types

type DiffGraphBuilder = DiffGraphBuilder
Inherited from:
NewStyleCpgPassBase

Value members

Concrete methods

def allSubclasses(typDeclFullName: String): LinkedHashSet[String]

Recursively returns all the sub-types of the given type declaration. Does not account for circular hierarchies.

Recursively returns all the sub-types of the given type declaration. Does not account for circular hierarchies.

override def run(dstGraph: DiffGraphBuilder): Unit

Main method of enhancement - to be implemented by child class

Main method of enhancement - to be implemented by child class

Definition Classes
SimpleCpgPass

Inherited methods

override def createAndApply(): Unit
Definition Classes
NewStyleCpgPassBase -> CpgPassBase
Inherited from:
NewStyleCpgPassBase
override def createApplySerializeAndStore(serializedCpg: SerializedCpg, inverse: Boolean, prefix: String): Unit
Definition Classes
ForkJoinParallelCpgPass -> CpgPassBase
Inherited from:
ForkJoinParallelCpgPass
def finish(): Unit
Inherited from:
NewStyleCpgPassBase
final override def generateParts(): Array[_ <: AnyRef]
Definition Classes
SimpleCpgPass -> NewStyleCpgPassBase
Inherited from:
SimpleCpgPass
def init(): Unit
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.

Inherited from:
CpgPassBase
final override def runOnPart(builder: DiffGraphBuilder, part: AnyRef): Unit
Definition Classes
SimpleCpgPass -> NewStyleCpgPassBase
Inherited from:
SimpleCpgPass
override def runWithBuilder(externalBuilder: DiffGraphBuilder): Int
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.

Inherited from:
CpgPassBase