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.
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.