TypeFlow: Simplify interface.

This commit is contained in:
Anders Schack-Mulligen
2024-10-28 15:09:09 +01:00
parent 3939eff260
commit fba4d09e65
4 changed files with 27 additions and 31 deletions

View File

@@ -84,10 +84,11 @@ private module Input implements TypeFlowInput<Location> {
}
/**
* Holds if data can flow from `n1` to `n2` in one step, and `n1` is not
* necessarily functionally determined by `n2`.
* Holds if data can flow from `n1` to `n2` in one step.
*
* For a given `n2`, this predicate must include all possible `n1` that can flow to `n2`.
*/
predicate joinStep(TypeFlowNode n1, TypeFlowNode n2) {
predicate step(TypeFlowNode n1, TypeFlowNode n2) {
n2.asExpr().(ChooseExpr).getAResultExpr() = n1.asExpr()
or
exists(Field f, Expr e |
@@ -112,13 +113,7 @@ private module Input implements TypeFlowInput<Location> {
// skip trivial recursion
not arg = n2.asSsa().getAUse()
)
}
/**
* Holds if data can flow from `n1` to `n2` in one step, and `n1` is
* functionally determined by `n2`.
*/
predicate uniqStep(TypeFlowNode n1, TypeFlowNode n2) {
or
n2.asExpr() = n1.asField().getAnAccess()
or
n2.asExpr() = n1.asSsa().getAUse()
@@ -169,7 +164,7 @@ private module Input implements TypeFlowInput<Location> {
*/
pragma[nomagic]
private predicate upcastCand(TypeFlowNode n, RefType t1, RefType t1e, RefType t2, RefType t2e) {
exists(TypeFlowNode next | uniqStep(n, next) or joinStep(n, next) |
exists(TypeFlowNode next | step(n, next) |
n.getType() = t1 and
next.getType() = t2 and
t1.getErasure() = t1e and