Skip to content

Commit 0e93f5a

Browse files
authored
Merge pull request github#15733 from hvitved/ruby/desugar-hidden
Ruby: Rework hidden synthetic data-flow nodes
2 parents 840ca91 + 914a605 commit 0e93f5a

File tree

16 files changed

+1289
-413
lines changed

16 files changed

+1289
-413
lines changed

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -800,7 +800,17 @@ predicate nodeIsHidden(Node n) {
800800
or
801801
n = LocalFlow::getParameterDefNode(_)
802802
or
803-
isDesugarNode(n.(ExprNode).getExprNode().getExpr())
803+
exists(AstNode desug |
804+
isDesugarNode(desug) and
805+
desug.isSynthesized() and
806+
not desug = [any(ArrayLiteral al).getDesugared(), any(HashLiteral hl).getDesugared()]
807+
|
808+
desug = n.asExpr().getExpr()
809+
or
810+
desug = n.(PostUpdateNode).getPreUpdateNode().asExpr().getExpr()
811+
or
812+
desug = n.(ParameterNode).getParameter()
813+
)
804814
or
805815
n instanceof FlowSummaryNode
806816
or

ruby/ql/test/library-tests/dataflow/array-flow/array-flow.expected

Lines changed: 681 additions & 215 deletions
Large diffs are not rendered by default.

ruby/ql/test/library-tests/dataflow/array-flow/array_flow.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1672,3 +1672,20 @@ def m139(i)
16721672
sink(a2[i]) # $ hasValueFlow=139.2
16731673
end
16741674
end
1675+
1676+
def m139
1677+
a = [0, 1, source(139.1)]
1678+
b = a.map do |x|
1679+
x
1680+
end
1681+
sink b[2] # $ hasValueFlow=139.1
1682+
end
1683+
1684+
def m140
1685+
a = [0, 1, source(140.1), source(140.2)]
1686+
x, y, z, w = a
1687+
sink x
1688+
sink y
1689+
sink z # $ hasValueFlow=140.1
1690+
sink w # $ hasValueFlow=140.2
1691+
end

ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,10 @@ edges
162162
| semantics.rb:116:5:116:5 | h [element :a] | semantics.rb:117:16:117:16 | h [element :a] | provenance | |
163163
| semantics.rb:116:5:116:5 | h [element :a] | semantics.rb:121:22:121:22 | h [element :a] | provenance | |
164164
| semantics.rb:116:5:116:5 | h [element :a] | semantics.rb:121:22:121:22 | h [element :a] | provenance | |
165-
| semantics.rb:116:14:116:14 | a | semantics.rb:116:5:116:5 | h [element :a] | provenance | |
166-
| semantics.rb:116:14:116:14 | a | semantics.rb:116:5:116:5 | h [element :a] | provenance | |
165+
| semantics.rb:116:9:116:22 | call to [] [element :a] | semantics.rb:116:5:116:5 | h [element :a] | provenance | |
166+
| semantics.rb:116:9:116:22 | call to [] [element :a] | semantics.rb:116:5:116:5 | h [element :a] | provenance | |
167+
| semantics.rb:116:14:116:14 | a | semantics.rb:116:9:116:22 | call to [] [element :a] | provenance | |
168+
| semantics.rb:116:14:116:14 | a | semantics.rb:116:9:116:22 | call to [] [element :a] | provenance | |
167169
| semantics.rb:117:14:117:16 | ** ... [element :a] | semantics.rb:117:10:117:17 | call to s16 | provenance | |
168170
| semantics.rb:117:14:117:16 | ** ... [element :a] | semantics.rb:117:10:117:17 | call to s16 | provenance | |
169171
| semantics.rb:117:16:117:16 | h [element :a] | semantics.rb:117:14:117:16 | ** ... [element :a] | provenance | |
@@ -212,10 +214,14 @@ edges
212214
| semantics.rb:135:5:135:7 | arr [element 0] | semantics.rb:136:15:136:17 | arr [element 0] | provenance | |
213215
| semantics.rb:135:5:135:7 | arr [element 1] | semantics.rb:136:15:136:17 | arr [element 1] | provenance | |
214216
| semantics.rb:135:5:135:7 | arr [element 1] | semantics.rb:136:15:136:17 | arr [element 1] | provenance | |
215-
| semantics.rb:135:12:135:12 | a | semantics.rb:135:5:135:7 | arr [element 0] | provenance | |
216-
| semantics.rb:135:12:135:12 | a | semantics.rb:135:5:135:7 | arr [element 0] | provenance | |
217-
| semantics.rb:135:15:135:15 | b | semantics.rb:135:5:135:7 | arr [element 1] | provenance | |
218-
| semantics.rb:135:15:135:15 | b | semantics.rb:135:5:135:7 | arr [element 1] | provenance | |
217+
| semantics.rb:135:11:135:16 | call to [] [element 0] | semantics.rb:135:5:135:7 | arr [element 0] | provenance | |
218+
| semantics.rb:135:11:135:16 | call to [] [element 0] | semantics.rb:135:5:135:7 | arr [element 0] | provenance | |
219+
| semantics.rb:135:11:135:16 | call to [] [element 1] | semantics.rb:135:5:135:7 | arr [element 1] | provenance | |
220+
| semantics.rb:135:11:135:16 | call to [] [element 1] | semantics.rb:135:5:135:7 | arr [element 1] | provenance | |
221+
| semantics.rb:135:12:135:12 | a | semantics.rb:135:11:135:16 | call to [] [element 0] | provenance | |
222+
| semantics.rb:135:12:135:12 | a | semantics.rb:135:11:135:16 | call to [] [element 0] | provenance | |
223+
| semantics.rb:135:15:135:15 | b | semantics.rb:135:11:135:16 | call to [] [element 1] | provenance | |
224+
| semantics.rb:135:15:135:15 | b | semantics.rb:135:11:135:16 | call to [] [element 1] | provenance | |
219225
| semantics.rb:136:14:136:17 | * ... [element 0] | semantics.rb:136:10:136:18 | call to s18 | provenance | |
220226
| semantics.rb:136:14:136:17 | * ... [element 0] | semantics.rb:136:10:136:18 | call to s18 | provenance | |
221227
| semantics.rb:136:14:136:17 | * ... [element 1] | semantics.rb:136:10:136:18 | call to s18 | provenance | |
@@ -1275,6 +1281,8 @@ nodes
12751281
| semantics.rb:115:9:115:18 | call to source | semmle.label | call to source |
12761282
| semantics.rb:116:5:116:5 | h [element :a] | semmle.label | h [element :a] |
12771283
| semantics.rb:116:5:116:5 | h [element :a] | semmle.label | h [element :a] |
1284+
| semantics.rb:116:9:116:22 | call to [] [element :a] | semmle.label | call to [] [element :a] |
1285+
| semantics.rb:116:9:116:22 | call to [] [element :a] | semmle.label | call to [] [element :a] |
12781286
| semantics.rb:116:14:116:14 | a | semmle.label | a |
12791287
| semantics.rb:116:14:116:14 | a | semmle.label | a |
12801288
| semantics.rb:117:10:117:17 | call to s16 | semmle.label | call to s16 |
@@ -1332,6 +1340,10 @@ nodes
13321340
| semantics.rb:135:5:135:7 | arr [element 0] | semmle.label | arr [element 0] |
13331341
| semantics.rb:135:5:135:7 | arr [element 1] | semmle.label | arr [element 1] |
13341342
| semantics.rb:135:5:135:7 | arr [element 1] | semmle.label | arr [element 1] |
1343+
| semantics.rb:135:11:135:16 | call to [] [element 0] | semmle.label | call to [] [element 0] |
1344+
| semantics.rb:135:11:135:16 | call to [] [element 0] | semmle.label | call to [] [element 0] |
1345+
| semantics.rb:135:11:135:16 | call to [] [element 1] | semmle.label | call to [] [element 1] |
1346+
| semantics.rb:135:11:135:16 | call to [] [element 1] | semmle.label | call to [] [element 1] |
13351347
| semantics.rb:135:12:135:12 | a | semmle.label | a |
13361348
| semantics.rb:135:12:135:12 | a | semmle.label | a |
13371349
| semantics.rb:135:15:135:15 | b | semmle.label | b |

0 commit comments

Comments
 (0)