Skip to content

Commit 66aa1c9

Browse files
committed
Ruby: Implement mustFlow
1 parent df5be83 commit 66aa1c9

File tree

3 files changed

+22
-14
lines changed

3 files changed

+22
-14
lines changed

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

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1700,7 +1700,27 @@ private predicate mustHaveLambdaType(CfgNodes::ExprCfgNode e, Callable c) {
17001700
)
17011701
}
17021702

1703-
predicate localMustFlowStep(Node node1, Node node2) { none() }
1703+
predicate localMustFlowStep(Node node1, Node node2) {
1704+
LocalFlow::localFlowSsaParamInput(node1, node2)
1705+
or
1706+
exists(SsaImpl::Definition def |
1707+
def.(Ssa::WriteDefinition).assigns(node1.asExpr()) and
1708+
node2.(SsaDefinitionExtNode).getDefinitionExt() = def
1709+
or
1710+
def = node1.(SsaDefinitionExtNode).getDefinitionExt() and
1711+
node2.asExpr() = SsaImpl::getARead(def)
1712+
)
1713+
or
1714+
node1.asExpr() = node2.asExpr().(CfgNodes::ExprNodes::AssignExprCfgNode).getRhs()
1715+
or
1716+
node1.asExpr() = node2.asExpr().(CfgNodes::ExprNodes::BlockArgumentCfgNode).getValue()
1717+
or
1718+
node1 =
1719+
unique(FlowSummaryNode n1 |
1720+
FlowSummaryImpl::Private::Steps::summaryLocalStep(n1.getSummaryNode(),
1721+
node2.(FlowSummaryNode).getSummaryNode(), true)
1722+
)
1723+
}
17041724

17051725
/** Gets the type of `n` used for type pruning. */
17061726
DataFlowType getNodeType(Node n) {

ruby/ql/test/library-tests/dataflow/global/Flow.expected

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,17 @@
11
testFailures
2-
| callbacks.rb:18:25:18:25 | x | Unexpected result: hasValueFlow=1 |
3-
| callbacks.rb:29:37:29:37 | x | Unexpected result: hasValueFlow=2 |
42
edges
53
| callbacks.rb:9:15:9:15 | x | callbacks.rb:10:12:10:12 | x |
64
| callbacks.rb:10:12:10:12 | x | callbacks.rb:17:15:17:15 | x |
7-
| callbacks.rb:10:12:10:12 | x | callbacks.rb:18:15:18:15 | x |
85
| callbacks.rb:13:20:13:20 | x | callbacks.rb:14:14:14:14 | x |
96
| callbacks.rb:14:14:14:14 | x | callbacks.rb:9:15:9:15 | x |
107
| callbacks.rb:17:15:17:15 | x | callbacks.rb:17:25:17:25 | x |
118
| callbacks.rb:17:31:17:38 | call to taint | callbacks.rb:13:20:13:20 | x |
12-
| callbacks.rb:18:15:18:15 | x | callbacks.rb:18:25:18:25 | x |
139
| callbacks.rb:20:17:20:17 | x | callbacks.rb:21:11:21:11 | x |
1410
| callbacks.rb:21:11:21:11 | x | callbacks.rb:28:31:28:31 | x |
15-
| callbacks.rb:21:11:21:11 | x | callbacks.rb:29:29:29:29 | x |
1611
| callbacks.rb:24:23:24:23 | x | callbacks.rb:25:17:25:17 | x |
1712
| callbacks.rb:25:17:25:17 | x | callbacks.rb:20:17:20:17 | x |
1813
| callbacks.rb:28:18:28:25 | call to taint | callbacks.rb:24:23:24:23 | x |
1914
| callbacks.rb:28:31:28:31 | x | callbacks.rb:28:39:28:39 | x |
20-
| callbacks.rb:29:29:29:29 | x | callbacks.rb:29:37:29:37 | x |
2115
| captured_variables.rb:9:24:9:24 | x | captured_variables.rb:10:10:10:23 | -> { ... } [captured x] |
2216
| captured_variables.rb:9:24:9:24 | x | captured_variables.rb:11:5:11:6 | fn [captured x] |
2317
| captured_variables.rb:10:5:10:6 | fn [captured x] | captured_variables.rb:11:5:11:6 | fn [captured x] |
@@ -278,17 +272,13 @@ nodes
278272
| callbacks.rb:17:15:17:15 | x | semmle.label | x |
279273
| callbacks.rb:17:25:17:25 | x | semmle.label | x |
280274
| callbacks.rb:17:31:17:38 | call to taint | semmle.label | call to taint |
281-
| callbacks.rb:18:15:18:15 | x | semmle.label | x |
282-
| callbacks.rb:18:25:18:25 | x | semmle.label | x |
283275
| callbacks.rb:20:17:20:17 | x | semmle.label | x |
284276
| callbacks.rb:21:11:21:11 | x | semmle.label | x |
285277
| callbacks.rb:24:23:24:23 | x | semmle.label | x |
286278
| callbacks.rb:25:17:25:17 | x | semmle.label | x |
287279
| callbacks.rb:28:18:28:25 | call to taint | semmle.label | call to taint |
288280
| callbacks.rb:28:31:28:31 | x | semmle.label | x |
289281
| callbacks.rb:28:39:28:39 | x | semmle.label | x |
290-
| callbacks.rb:29:29:29:29 | x | semmle.label | x |
291-
| callbacks.rb:29:37:29:37 | x | semmle.label | x |
292282
| captured_variables.rb:9:24:9:24 | x | semmle.label | x |
293283
| captured_variables.rb:10:5:10:6 | fn [captured x] | semmle.label | fn [captured x] |
294284
| captured_variables.rb:10:10:10:23 | -> { ... } [captured x] | semmle.label | -> { ... } [captured x] |
@@ -585,9 +575,7 @@ subpaths
585575
| instance_variables.rb:120:6:120:10 | foo16 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:120:6:120:20 | call to get_field |
586576
#select
587577
| callbacks.rb:17:25:17:25 | x | callbacks.rb:17:31:17:38 | call to taint | callbacks.rb:17:25:17:25 | x | $@ | callbacks.rb:17:31:17:38 | call to taint | call to taint |
588-
| callbacks.rb:18:25:18:25 | x | callbacks.rb:17:31:17:38 | call to taint | callbacks.rb:18:25:18:25 | x | $@ | callbacks.rb:17:31:17:38 | call to taint | call to taint |
589578
| callbacks.rb:28:39:28:39 | x | callbacks.rb:28:18:28:25 | call to taint | callbacks.rb:28:39:28:39 | x | $@ | callbacks.rb:28:18:28:25 | call to taint | call to taint |
590-
| callbacks.rb:29:37:29:37 | x | callbacks.rb:28:18:28:25 | call to taint | callbacks.rb:29:37:29:37 | x | $@ | callbacks.rb:28:18:28:25 | call to taint | call to taint |
591579
| captured_variables.rb:10:20:10:20 | x | captured_variables.rb:13:20:13:29 | call to taint | captured_variables.rb:10:20:10:20 | x | $@ | captured_variables.rb:13:20:13:29 | call to taint | call to taint |
592580
| captured_variables.rb:17:14:17:14 | x | captured_variables.rb:20:25:20:34 | call to taint | captured_variables.rb:17:14:17:14 | x | $@ | captured_variables.rb:20:25:20:34 | call to taint | call to taint |
593581
| captured_variables.rb:24:14:24:14 | x | captured_variables.rb:27:48:27:57 | call to taint | captured_variables.rb:24:14:24:14 | x | $@ | captured_variables.rb:27:48:27:57 | call to taint | call to taint |

shared/dataflow/codeql/dataflow/internal/DataFlowImplCommon.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -971,7 +971,7 @@ module MakeImplCommon<InputSig Lang> {
971971
predicate allowParameterReturnInSelfCached(ParamNode p) { allowParameterReturnInSelf(p) }
972972

973973
cached
974-
predicate paramMustFlow(ParamNode p, ArgNode arg) { localMustFlowStep+(p, arg) }
974+
predicate paramMustFlow(ParamNode p, ArgNode arg) { localMustFlowStep*(p, arg) }
975975

976976
cached
977977
newtype TCallContext =

0 commit comments

Comments
 (0)