Ensure pattern-case and binding-instanceof are covered in all of type, dispatch and object flow

This commit is contained in:
Chris Smowton
2023-11-09 15:48:24 +00:00
parent 88d9caff8c
commit fa09be0459
3 changed files with 35 additions and 0 deletions

View File

@@ -116,6 +116,22 @@ private predicate step(TypeFlowNode n1, TypeFlowNode n2) {
n2.asSsa().(BaseSsaUpdate).getDefiningExpr().(VariableAssign).getSource() = n1.asExpr()
or
n2.asSsa().(BaseSsaImplicitInit).captures(n1.asSsa())
or
exists(PatternCase pc, LocalVariableDeclExpr patternVar |
patternVar = pc.getPattern().asBindingPattern() and
n2.asSsa().(BaseSsaUpdate).getDefiningExpr() = patternVar and
(
pc.getSwitch().getExpr() = n1.asExpr()
or
pc.getSwitchExpr().getExpr() = n1.asExpr()
)
)
or
exists(InstanceOfExpr ioe, LocalVariableDeclExpr patternVar |
patternVar = ioe.getPattern().asBindingPattern() and
n2.asSsa().(BaseSsaUpdate).getDefiningExpr() = patternVar and
ioe.getExpr() = n1.asExpr()
)
}
/**

View File

@@ -167,6 +167,20 @@ private module TypeTrackingSteps {
def.(BaseSsaUpdate).getDefiningExpr().(VariableAssign).getSource() = n1.asExpr()
or
def.(BaseSsaImplicitInit).isParameterDefinition(n1.asParameter())
or
exists(PatternCase pc |
pc.getPattern().asBindingPattern() = def.(BaseSsaUpdate).getDefiningExpr() and
(
pc.getSwitch().getExpr() = n1.asExpr()
or
pc.getSwitchExpr().getExpr() = n1.asExpr()
)
)
or
exists(InstanceOfExpr ioe |
ioe.getPattern().asBindingPattern() = def.(BaseSsaUpdate).getDefiningExpr() and
ioe.getExpr() = n1.asExpr()
)
|
v.getAnUltimateDefinition() = def and
v.getAUse() = n2.asExpr()

View File

@@ -89,6 +89,11 @@ private predicate step(Node n1, Node n2) {
pc.getSwitchExpr().getExpr() = n1.asExpr()
)
)
or
exists(InstanceOfExpr ioe |
ioe.getPattern().asBindingPattern() = def.(BaseSsaUpdate).getDefiningExpr() and
ioe.getExpr() = n1.asExpr()
)
|
v.getAnUltimateDefinition() = def and
v.getAUse() = n2.asExpr()