Introduced a few different ways to better map from our TAC statements to source:
Added relation .decl Statement_OriginalStatementList(irstmt: Statement, stmtList: OriginalStatementList) that maps TAC statements to sequences of call-sites in the original bytecode. This accounts for inlined functions.
Defined a new type .type CallStack = [callerBlock: Block, rest: CallStack] and computed the different ways a function can be reachable from a public entry point in .decl FunctionReachableFromPublic(function: Function, selector: symbol, callStack: CallStack). CallStack can be converted to OriginalStatementList for mapping to bytecode.
In addition, the Flows components APIs were changed, moving from defining TransferOp(op: Opcode) as input to TransferStmt(stmt: Statement). This allows us to define more fine-grained data-flow analyses as demonstrated in constantOpFlows.
Introduced a few different ways to better map from our TAC statements to source:
.decl Statement_OriginalStatementList(irstmt: Statement, stmtList: OriginalStatementList)
that maps TAC statements to sequences of call-sites in the original bytecode. This accounts for inlined functions..type CallStack = [callerBlock: Block, rest: CallStack]
and computed the different ways a function can be reachable from a public entry point in.decl FunctionReachableFromPublic(function: Function, selector: symbol, callStack: CallStack)
. CallStack can be converted to OriginalStatementList for mapping to bytecode.In addition, the Flows components APIs were changed, moving from defining
TransferOp(op: Opcode)
as input toTransferStmt(stmt: Statement)
. This allows us to define more fine-grained data-flow analyses as demonstrated inconstantOpFlows
.