Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit fa09be0

Browse files
committed
Ensure pattern-case and binding-instanceof are covered in all of type, dispatch and object flow
1 parent 88d9caf commit fa09be0

3 files changed

Lines changed: 35 additions & 0 deletions

File tree

java/ql/lib/semmle/code/java/dataflow/TypeFlow.qll

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,22 @@ private predicate step(TypeFlowNode n1, TypeFlowNode n2) {
116116
n2.asSsa().(BaseSsaUpdate).getDefiningExpr().(VariableAssign).getSource() = n1.asExpr()
117117
or
118118
n2.asSsa().(BaseSsaImplicitInit).captures(n1.asSsa())
119+
or
120+
exists(PatternCase pc, LocalVariableDeclExpr patternVar |
121+
patternVar = pc.getPattern().asBindingPattern() and
122+
n2.asSsa().(BaseSsaUpdate).getDefiningExpr() = patternVar and
123+
(
124+
pc.getSwitch().getExpr() = n1.asExpr()
125+
or
126+
pc.getSwitchExpr().getExpr() = n1.asExpr()
127+
)
128+
)
129+
or
130+
exists(InstanceOfExpr ioe, LocalVariableDeclExpr patternVar |
131+
patternVar = ioe.getPattern().asBindingPattern() and
132+
n2.asSsa().(BaseSsaUpdate).getDefiningExpr() = patternVar and
133+
ioe.getExpr() = n1.asExpr()
134+
)
119135
}
120136

121137
/**

java/ql/lib/semmle/code/java/dispatch/DispatchFlow.qll

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,20 @@ private module TypeTrackingSteps {
167167
def.(BaseSsaUpdate).getDefiningExpr().(VariableAssign).getSource() = n1.asExpr()
168168
or
169169
def.(BaseSsaImplicitInit).isParameterDefinition(n1.asParameter())
170+
or
171+
exists(PatternCase pc |
172+
pc.getPattern().asBindingPattern() = def.(BaseSsaUpdate).getDefiningExpr() and
173+
(
174+
pc.getSwitch().getExpr() = n1.asExpr()
175+
or
176+
pc.getSwitchExpr().getExpr() = n1.asExpr()
177+
)
178+
)
179+
or
180+
exists(InstanceOfExpr ioe |
181+
ioe.getPattern().asBindingPattern() = def.(BaseSsaUpdate).getDefiningExpr() and
182+
ioe.getExpr() = n1.asExpr()
183+
)
170184
|
171185
v.getAnUltimateDefinition() = def and
172186
v.getAUse() = n2.asExpr()

java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,11 @@ private predicate step(Node n1, Node n2) {
8989
pc.getSwitchExpr().getExpr() = n1.asExpr()
9090
)
9191
)
92+
or
93+
exists(InstanceOfExpr ioe |
94+
ioe.getPattern().asBindingPattern() = def.(BaseSsaUpdate).getDefiningExpr() and
95+
ioe.getExpr() = n1.asExpr()
96+
)
9297
|
9398
v.getAnUltimateDefinition() = def and
9499
v.getAUse() = n2.asExpr()

0 commit comments

Comments
 (0)