Skip to content

Commit 6c71148

Browse files
committed
Ruby: remove CaseExprChildMapping::getBranch
1 parent 7644d60 commit 6c71148

File tree

5 files changed

+62
-7
lines changed

5 files changed

+62
-7
lines changed

ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ module ExprNodes {
338338
}
339339

340340
private class CaseExprChildMapping extends ExprChildMapping, CaseExpr {
341-
override predicate relevantChild(Expr e) { e = this.getValue() or e = this.getBranch(_) }
341+
override predicate relevantChild(Expr e) { e = this.getValue() }
342342
}
343343

344344
/** A control-flow node that wraps a `MethodCall` AST expression. */
@@ -356,11 +356,6 @@ module ExprNodes {
356356

357357
/** Gets the expression being compared, if any. */
358358
final ExprCfgNode getValue() { e.hasCfgChild(e.getValue(), this, result) }
359-
360-
/**
361-
* Gets the `n`th branch of this case expression.
362-
*/
363-
final ExprCfgNode getBranch(int n) { e.hasCfgChild(e.getBranch(n), this, result) }
364359
}
365360

366361
private class ConditionalExprChildMapping extends ExprChildMapping, ConditionalExpr {

ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,16 @@ module LocalFlow {
126126
or
127127
nodeFrom.asExpr() = nodeTo.asExpr().(CfgNodes::ExprNodes::ConditionalExprCfgNode).getBranch(_)
128128
or
129-
nodeFrom.asExpr() = nodeTo.asExpr().(CfgNodes::ExprNodes::CaseExprCfgNode).getBranch(_)
129+
exists(CfgNode n, Stmt stmt, CaseExpr c |
130+
c = nodeTo.asExpr().getExpr() and
131+
n = nodeFrom.asExpr() and
132+
n = nodeTo.asExpr().getAPredecessor() and
133+
stmt = n.getNode()
134+
|
135+
stmt = c.getElseBranch() or
136+
stmt = c.getABranch().(InClause).getBody() or
137+
stmt = c.getABranch().(WhenExpr).getBody()
138+
)
130139
or
131140
exists(CfgNodes::ExprCfgNode exprTo, ReturningStatementNode n |
132141
nodeFrom = n and

ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,33 @@
7070
| local_dataflow.rb:50:18:50:18 | [post] x | local_dataflow.rb:51:20:51:20 | x |
7171
| local_dataflow.rb:50:18:50:18 | x | local_dataflow.rb:51:20:51:20 | x |
7272
| local_dataflow.rb:51:9:51:15 | "break" | local_dataflow.rb:51:3:51:15 | break |
73+
| local_dataflow.rb:60:15:60:15 | x | local_dataflow.rb:60:15:60:15 | x |
74+
| local_dataflow.rb:60:15:60:15 | x | local_dataflow.rb:61:12:61:12 | x |
75+
| local_dataflow.rb:61:7:68:5 | case ... | local_dataflow.rb:61:3:68:5 | ... = ... |
76+
| local_dataflow.rb:61:12:61:12 | x | local_dataflow.rb:63:15:63:15 | x |
77+
| local_dataflow.rb:61:12:61:12 | x | local_dataflow.rb:65:6:65:6 | x |
78+
| local_dataflow.rb:61:12:61:12 | x | local_dataflow.rb:67:5:67:5 | x |
79+
| local_dataflow.rb:61:12:61:12 | x | local_dataflow.rb:69:12:69:12 | x |
80+
| local_dataflow.rb:62:10:62:15 | then ... | local_dataflow.rb:61:7:68:5 | case ... |
81+
| local_dataflow.rb:62:15:62:15 | 3 | local_dataflow.rb:62:10:62:15 | then ... |
82+
| local_dataflow.rb:63:10:63:15 | then ... | local_dataflow.rb:61:7:68:5 | case ... |
83+
| local_dataflow.rb:63:15:63:15 | x | local_dataflow.rb:63:10:63:15 | then ... |
84+
| local_dataflow.rb:63:15:63:15 | x | local_dataflow.rb:69:12:69:12 | x |
85+
| local_dataflow.rb:64:9:65:6 | then ... | local_dataflow.rb:61:7:68:5 | case ... |
86+
| local_dataflow.rb:65:6:65:6 | x | local_dataflow.rb:64:9:65:6 | then ... |
87+
| local_dataflow.rb:65:6:65:6 | x | local_dataflow.rb:69:12:69:12 | x |
88+
| local_dataflow.rb:66:3:67:5 | else ... | local_dataflow.rb:61:7:68:5 | case ... |
89+
| local_dataflow.rb:67:5:67:5 | x | local_dataflow.rb:66:3:67:5 | else ... |
90+
| local_dataflow.rb:67:5:67:5 | x | local_dataflow.rb:69:12:69:12 | x |
91+
| local_dataflow.rb:69:7:76:5 | case ... | local_dataflow.rb:69:3:76:5 | ... = ... |
92+
| local_dataflow.rb:69:12:69:12 | x | local_dataflow.rb:71:13:71:13 | x |
93+
| local_dataflow.rb:69:12:69:12 | x | local_dataflow.rb:73:7:73:7 | x |
94+
| local_dataflow.rb:69:12:69:12 | x | local_dataflow.rb:75:6:75:6 | x |
95+
| local_dataflow.rb:70:8:70:13 | then ... | local_dataflow.rb:69:7:76:5 | case ... |
96+
| local_dataflow.rb:70:13:70:13 | 4 | local_dataflow.rb:70:8:70:13 | then ... |
97+
| local_dataflow.rb:71:8:71:13 | then ... | local_dataflow.rb:69:7:76:5 | case ... |
98+
| local_dataflow.rb:71:13:71:13 | x | local_dataflow.rb:71:8:71:13 | then ... |
99+
| local_dataflow.rb:72:7:73:7 | then ... | local_dataflow.rb:69:7:76:5 | case ... |
100+
| local_dataflow.rb:73:7:73:7 | x | local_dataflow.rb:72:7:73:7 | then ... |
101+
| local_dataflow.rb:74:3:75:6 | else ... | local_dataflow.rb:69:7:76:5 | case ... |
102+
| local_dataflow.rb:75:6:75:6 | x | local_dataflow.rb:74:3:75:6 | else ... |

ruby/ql/test/library-tests/dataflow/local/Nodes.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ ret
1212
| local_dataflow.rb:50:3:50:13 | next |
1313
| local_dataflow.rb:51:3:51:15 | break |
1414
| local_dataflow.rb:52:3:52:10 | "normal" |
15+
| local_dataflow.rb:69:3:76:5 | ... = ... |
1516
arg
1617
| local_dataflow.rb:3:8:3:10 | self | local_dataflow.rb:3:8:3:10 | call to p | -1 |
1718
| local_dataflow.rb:3:10:3:10 | a | local_dataflow.rb:3:8:3:10 | call to p | 0 |

ruby/ql/test/library-tests/dataflow/local/local_dataflow.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,23 @@ def m x
5656

5757
def foo x
5858
end
59+
60+
def test_case x
61+
y = case x
62+
when 1 then 3
63+
when 2 then x
64+
when 3
65+
x
66+
else
67+
x
68+
end
69+
z = case x
70+
in 1 then 4
71+
in 2 then x
72+
in 3
73+
x
74+
else
75+
x
76+
end
77+
end
78+

0 commit comments

Comments
 (0)