Skip to content

Commit e96cbeb

Browse files
committed
Ruby: Adjust locations of synthesized nodes
1 parent 77fca27 commit e96cbeb

File tree

11 files changed

+137
-111
lines changed

11 files changed

+137
-111
lines changed

ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1276,13 +1276,19 @@ private module ForLoopDesugar {
12761276
result.getParent() = getForLoopPatternChild(for)
12771277
}
12781278

1279+
/** Holds if `n` is an access to variable `v` in the pattern of `for`. */
1280+
pragma[nomagic]
1281+
private predicate forLoopVariableAccess(Ruby::For for, Ruby::AstNode n, VariableReal v) {
1282+
n = getForLoopPatternChild(for) and
1283+
access(n, v)
1284+
}
1285+
12791286
/** Holds if `v` is the `i`th iteration variable of `for`. */
12801287
private predicate forLoopVariable(Ruby::For for, VariableReal v, int i) {
12811288
v =
12821289
rank[i + 1](VariableReal v0, Ruby::AstNode n, Location l |
1283-
n = getForLoopPatternChild(for) and
1284-
l = n.getLocation() and
1285-
access(n, v0)
1290+
forLoopVariableAccess(for, n, v0) and
1291+
l = n.getLocation()
12861292
|
12871293
v0 order by l.getStartLine(), l.getStartColumn()
12881294
)
@@ -1406,6 +1412,18 @@ private module ForLoopDesugar {
14061412
)
14071413
}
14081414

1415+
pragma[nomagic]
1416+
private predicate isDesugaredInitNode(ForExpr for, Variable v, AstNode n) {
1417+
exists(StmtSequence seq, AssignExpr ae |
1418+
seq = for.getDesugared() and
1419+
n = seq.getStmt(_) and
1420+
ae = n.(IfExpr).getThen() and
1421+
v = ae.getLeftOperand().getAVariable()
1422+
)
1423+
or
1424+
isDesugaredInitNode(for, v, n.getParent())
1425+
}
1426+
14091427
private class ForLoopSynthesis extends Synthesis {
14101428
final override predicate child(AstNode parent, int i, Child child) {
14111429
forLoopSynthesis(parent, i, child)
@@ -1425,6 +1443,14 @@ private module ForLoopDesugar {
14251443
final override predicate excludeFromControlFlowTree(AstNode n) {
14261444
n = any(ForExpr for).getBody()
14271445
}
1446+
1447+
final override predicate location(AstNode n, Location l) {
1448+
exists(ForExpr for, Ruby::AstNode access, Variable v |
1449+
forLoopVariableAccess(toTsFor(for), access, v) and
1450+
isDesugaredInitNode(for, v, n) and
1451+
l = access.getLocation()
1452+
)
1453+
}
14281454
}
14291455
}
14301456

ruby/ql/test/library-tests/ast/ValueText.expected

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ exprValue
1010
| calls/calls.rb:26:7:26:7 | 1 | 1 | int |
1111
| calls/calls.rb:36:9:36:11 | 100 | 100 | int |
1212
| calls/calls.rb:36:14:36:16 | 200 | 200 | int |
13-
| calls/calls.rb:226:1:228:3 | nil | nil | nil |
14-
| calls/calls.rb:229:1:231:3 | nil | nil | nil |
13+
| calls/calls.rb:226:5:226:5 | nil | nil | nil |
14+
| calls/calls.rb:229:5:229:5 | nil | nil | nil |
1515
| calls/calls.rb:280:5:280:8 | :blah | :blah | symbol |
1616
| calls/calls.rb:281:5:281:8 | :blah | :blah | symbol |
1717
| calls/calls.rb:290:11:290:16 | "blah" | blah | string |
@@ -59,12 +59,12 @@ exprValue
5959
| calls/calls.rb:322:31:322:31 | 1 | 1 | int |
6060
| calls/calls.rb:322:37:322:37 | 2 | 2 | int |
6161
| calls/calls.rb:330:31:330:37 | "error" | error | string |
62-
| calls/calls.rb:342:1:344:3 | nil | nil | nil |
63-
| calls/calls.rb:342:1:344:3 | nil | nil | nil |
64-
| calls/calls.rb:342:1:344:3 | nil | nil | nil |
6562
| calls/calls.rb:342:5:342:5 | 0 | 0 | int |
63+
| calls/calls.rb:342:5:342:5 | nil | nil | nil |
6664
| calls/calls.rb:342:8:342:8 | 1 | 1 | int |
65+
| calls/calls.rb:342:8:342:8 | nil | nil | nil |
6766
| calls/calls.rb:342:11:342:11 | 2 | 2 | int |
67+
| calls/calls.rb:342:11:342:11 | nil | nil | nil |
6868
| calls/calls.rb:342:18:342:18 | 1 | 1 | int |
6969
| calls/calls.rb:342:20:342:20 | 2 | 2 | int |
7070
| calls/calls.rb:342:22:342:22 | 3 | 3 | int |
@@ -335,24 +335,24 @@ exprValue
335335
| control/loops.rb:4:5:4:5 | 0 | 0 | int |
336336
| control/loops.rb:5:5:5:5 | 0 | 0 | int |
337337
| control/loops.rb:6:5:6:5 | 0 | 0 | int |
338-
| control/loops.rb:9:1:12:3 | nil | nil | nil |
338+
| control/loops.rb:9:5:9:5 | nil | nil | nil |
339339
| control/loops.rb:9:10:9:10 | 1 | 1 | int |
340340
| control/loops.rb:9:13:9:14 | 10 | 10 | int |
341-
| control/loops.rb:16:1:19:3 | nil | nil | nil |
341+
| control/loops.rb:16:5:16:5 | nil | nil | nil |
342342
| control/loops.rb:16:10:16:10 | 1 | 1 | int |
343343
| control/loops.rb:16:13:16:14 | 10 | 10 | int |
344-
| control/loops.rb:22:1:25:3 | nil | nil | nil |
345-
| control/loops.rb:22:1:25:3 | nil | nil | nil |
346344
| control/loops.rb:22:5:22:7 | 0 | 0 | int |
345+
| control/loops.rb:22:5:22:7 | nil | nil | nil |
347346
| control/loops.rb:22:10:22:14 | 1 | 1 | int |
347+
| control/loops.rb:22:10:22:14 | nil | nil | nil |
348348
| control/loops.rb:22:20:22:22 | :foo | :foo | symbol |
349349
| control/loops.rb:22:25:22:25 | 0 | 0 | int |
350350
| control/loops.rb:22:28:22:30 | :bar | :bar | symbol |
351351
| control/loops.rb:22:33:22:33 | 1 | 1 | int |
352-
| control/loops.rb:28:1:32:3 | nil | nil | nil |
353-
| control/loops.rb:28:1:32:3 | nil | nil | nil |
354352
| control/loops.rb:28:6:28:8 | 0 | 0 | int |
353+
| control/loops.rb:28:6:28:8 | nil | nil | nil |
355354
| control/loops.rb:28:11:28:15 | 1 | 1 | int |
355+
| control/loops.rb:28:11:28:15 | nil | nil | nil |
356356
| control/loops.rb:28:22:28:24 | :foo | :foo | symbol |
357357
| control/loops.rb:28:27:28:27 | 0 | 0 | int |
358358
| control/loops.rb:28:30:28:32 | :bar | :bar | symbol |
@@ -376,7 +376,7 @@ exprValue
376376
| control/loops.rb:66:11:66:11 | y | 0 | int |
377377
| erb/template.html.erb:19:5:19:17 | "hello world" | hello world | string |
378378
| erb/template.html.erb:25:9:25:10 | "" | | string |
379-
| erb/template.html.erb:27:6:31:8 | nil | nil | nil |
379+
| erb/template.html.erb:27:10:27:10 | nil | nil | nil |
380380
| erb/template.html.erb:27:16:27:20 | "foo" | foo | string |
381381
| erb/template.html.erb:27:23:27:27 | "bar" | bar | string |
382382
| erb/template.html.erb:27:30:27:34 | "baz" | baz | string |
@@ -946,8 +946,8 @@ exprCfgNodeValue
946946
| calls/calls.rb:26:7:26:7 | 1 | 1 | int |
947947
| calls/calls.rb:36:9:36:11 | 100 | 100 | int |
948948
| calls/calls.rb:36:14:36:16 | 200 | 200 | int |
949-
| calls/calls.rb:226:1:228:3 | nil | nil | nil |
950-
| calls/calls.rb:229:1:231:3 | nil | nil | nil |
949+
| calls/calls.rb:226:5:226:5 | nil | nil | nil |
950+
| calls/calls.rb:229:5:229:5 | nil | nil | nil |
951951
| calls/calls.rb:280:5:280:8 | :blah | :blah | symbol |
952952
| calls/calls.rb:281:5:281:8 | :blah | :blah | symbol |
953953
| calls/calls.rb:290:11:290:16 | "blah" | blah | string |
@@ -995,12 +995,12 @@ exprCfgNodeValue
995995
| calls/calls.rb:322:31:322:31 | 1 | 1 | int |
996996
| calls/calls.rb:322:37:322:37 | 2 | 2 | int |
997997
| calls/calls.rb:330:31:330:37 | "error" | error | string |
998-
| calls/calls.rb:342:1:344:3 | nil | nil | nil |
999-
| calls/calls.rb:342:1:344:3 | nil | nil | nil |
1000-
| calls/calls.rb:342:1:344:3 | nil | nil | nil |
1001998
| calls/calls.rb:342:5:342:5 | 0 | 0 | int |
999+
| calls/calls.rb:342:5:342:5 | nil | nil | nil |
10021000
| calls/calls.rb:342:8:342:8 | 1 | 1 | int |
1001+
| calls/calls.rb:342:8:342:8 | nil | nil | nil |
10031002
| calls/calls.rb:342:11:342:11 | 2 | 2 | int |
1003+
| calls/calls.rb:342:11:342:11 | nil | nil | nil |
10041004
| calls/calls.rb:342:18:342:18 | 1 | 1 | int |
10051005
| calls/calls.rb:342:20:342:20 | 2 | 2 | int |
10061006
| calls/calls.rb:342:22:342:22 | 3 | 3 | int |
@@ -1243,24 +1243,24 @@ exprCfgNodeValue
12431243
| control/loops.rb:4:5:4:5 | 0 | 0 | int |
12441244
| control/loops.rb:5:5:5:5 | 0 | 0 | int |
12451245
| control/loops.rb:6:5:6:5 | 0 | 0 | int |
1246-
| control/loops.rb:9:1:12:3 | nil | nil | nil |
1246+
| control/loops.rb:9:5:9:5 | nil | nil | nil |
12471247
| control/loops.rb:9:10:9:10 | 1 | 1 | int |
12481248
| control/loops.rb:9:13:9:14 | 10 | 10 | int |
1249-
| control/loops.rb:16:1:19:3 | nil | nil | nil |
1249+
| control/loops.rb:16:5:16:5 | nil | nil | nil |
12501250
| control/loops.rb:16:10:16:10 | 1 | 1 | int |
12511251
| control/loops.rb:16:13:16:14 | 10 | 10 | int |
1252-
| control/loops.rb:22:1:25:3 | nil | nil | nil |
1253-
| control/loops.rb:22:1:25:3 | nil | nil | nil |
12541252
| control/loops.rb:22:5:22:7 | 0 | 0 | int |
1253+
| control/loops.rb:22:5:22:7 | nil | nil | nil |
12551254
| control/loops.rb:22:10:22:14 | 1 | 1 | int |
1255+
| control/loops.rb:22:10:22:14 | nil | nil | nil |
12561256
| control/loops.rb:22:20:22:22 | :foo | :foo | symbol |
12571257
| control/loops.rb:22:25:22:25 | 0 | 0 | int |
12581258
| control/loops.rb:22:28:22:30 | :bar | :bar | symbol |
12591259
| control/loops.rb:22:33:22:33 | 1 | 1 | int |
1260-
| control/loops.rb:28:1:32:3 | nil | nil | nil |
1261-
| control/loops.rb:28:1:32:3 | nil | nil | nil |
12621260
| control/loops.rb:28:6:28:8 | 0 | 0 | int |
1261+
| control/loops.rb:28:6:28:8 | nil | nil | nil |
12631262
| control/loops.rb:28:11:28:15 | 1 | 1 | int |
1263+
| control/loops.rb:28:11:28:15 | nil | nil | nil |
12641264
| control/loops.rb:28:22:28:24 | :foo | :foo | symbol |
12651265
| control/loops.rb:28:27:28:27 | 0 | 0 | int |
12661266
| control/loops.rb:28:30:28:32 | :bar | :bar | symbol |
@@ -1284,7 +1284,7 @@ exprCfgNodeValue
12841284
| control/loops.rb:66:11:66:11 | y | 0 | int |
12851285
| erb/template.html.erb:19:5:19:17 | "hello world" | hello world | string |
12861286
| erb/template.html.erb:25:9:25:10 | "" | | string |
1287-
| erb/template.html.erb:27:6:31:8 | nil | nil | nil |
1287+
| erb/template.html.erb:27:10:27:10 | nil | nil | nil |
12881288
| erb/template.html.erb:27:16:27:20 | "foo" | foo | string |
12891289
| erb/template.html.erb:27:23:27:27 | "bar" | bar | string |
12901290
| erb/template.html.erb:27:30:27:34 | "baz" | baz | string |

ruby/ql/test/library-tests/ast/calls/calls.expected

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -250,14 +250,14 @@ callsWithReceiver
250250
| calls.rb:222:11:222:13 | call to foo | calls.rb:222:11:222:13 | self |
251251
| calls.rb:223:1:223:6 | call to bar | calls.rb:223:1:223:1 | X |
252252
| calls.rb:223:14:223:19 | call to foo | calls.rb:223:14:223:14 | X |
253-
| calls.rb:226:1:228:3 | ! ... | calls.rb:226:1:228:3 | defined? ... |
254253
| calls.rb:226:1:228:3 | call to each | calls.rb:226:10:226:12 | call to bar |
255-
| calls.rb:226:1:228:3 | defined? ... | calls.rb:226:1:228:3 | x |
254+
| calls.rb:226:5:226:5 | ! ... | calls.rb:226:5:226:5 | defined? ... |
255+
| calls.rb:226:5:226:5 | defined? ... | calls.rb:226:5:226:5 | x |
256256
| calls.rb:226:10:226:12 | call to bar | calls.rb:226:10:226:12 | self |
257257
| calls.rb:227:3:227:5 | call to baz | calls.rb:227:3:227:5 | self |
258-
| calls.rb:229:1:231:3 | ! ... | calls.rb:229:1:231:3 | defined? ... |
259258
| calls.rb:229:1:231:3 | call to each | calls.rb:229:10:229:15 | call to bar |
260-
| calls.rb:229:1:231:3 | defined? ... | calls.rb:229:1:231:3 | x |
259+
| calls.rb:229:5:229:5 | ! ... | calls.rb:229:5:229:5 | defined? ... |
260+
| calls.rb:229:5:229:5 | defined? ... | calls.rb:229:5:229:5 | x |
261261
| calls.rb:229:10:229:15 | call to bar | calls.rb:229:10:229:10 | X |
262262
| calls.rb:230:3:230:8 | call to baz | calls.rb:230:3:230:3 | X |
263263
| calls.rb:234:1:234:3 | call to foo | calls.rb:234:1:234:3 | self |
@@ -378,17 +378,17 @@ callsWithReceiver
378378
| calls.rb:330:13:330:15 | call to bar | calls.rb:330:13:330:15 | self |
379379
| calls.rb:330:25:330:37 | call to print | calls.rb:330:25:330:37 | self |
380380
| calls.rb:338:3:338:13 | call to bar | calls.rb:338:3:338:13 | self |
381-
| calls.rb:342:1:344:3 | ! ... | calls.rb:342:1:344:3 | defined? ... |
382-
| calls.rb:342:1:344:3 | ! ... | calls.rb:342:1:344:3 | defined? ... |
383-
| calls.rb:342:1:344:3 | ! ... | calls.rb:342:1:344:3 | defined? ... |
384381
| calls.rb:342:1:344:3 | * ... | calls.rb:342:1:344:3 | __synth__0__1 |
385382
| calls.rb:342:1:344:3 | call to each | calls.rb:342:16:342:33 | [...] |
386-
| calls.rb:342:1:344:3 | defined? ... | calls.rb:342:1:344:3 | x |
387-
| calls.rb:342:1:344:3 | defined? ... | calls.rb:342:1:344:3 | y |
388-
| calls.rb:342:1:344:3 | defined? ... | calls.rb:342:1:344:3 | z |
383+
| calls.rb:342:5:342:5 | ! ... | calls.rb:342:5:342:5 | defined? ... |
389384
| calls.rb:342:5:342:5 | call to [] | calls.rb:342:5:342:5 | __synth__3__1 |
385+
| calls.rb:342:5:342:5 | defined? ... | calls.rb:342:5:342:5 | x |
386+
| calls.rb:342:8:342:8 | ! ... | calls.rb:342:8:342:8 | defined? ... |
390387
| calls.rb:342:8:342:8 | call to [] | calls.rb:342:8:342:8 | __synth__3__1 |
388+
| calls.rb:342:8:342:8 | defined? ... | calls.rb:342:8:342:8 | y |
389+
| calls.rb:342:11:342:11 | ! ... | calls.rb:342:11:342:11 | defined? ... |
391390
| calls.rb:342:11:342:11 | call to [] | calls.rb:342:11:342:11 | __synth__3__1 |
391+
| calls.rb:342:11:342:11 | defined? ... | calls.rb:342:11:342:11 | z |
392392
| calls.rb:342:16:342:33 | call to [] | calls.rb:342:16:342:33 | Array |
393393
| calls.rb:342:17:342:23 | call to [] | calls.rb:342:17:342:23 | Array |
394394
| calls.rb:342:26:342:32 | call to [] | calls.rb:342:26:342:32 | Array |

ruby/ql/test/library-tests/ast/control/ConditionalExpr.expected

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ conditionalExprs
2222
| conditionals.rb:61:1:64:3 | if ... | IfExpr | conditionals.rb:61:4:61:8 | ... > ... | conditionals.rb:63:1:63:4 | else ... | false |
2323
| conditionals.rb:67:1:70:3 | if ... | IfExpr | conditionals.rb:67:4:67:8 | ... > ... | conditionals.rb:67:10:67:13 | then ... | true |
2424
| conditionals.rb:67:1:70:3 | if ... | IfExpr | conditionals.rb:67:4:67:8 | ... > ... | conditionals.rb:68:1:69:5 | else ... | false |
25-
| loops.rb:9:1:12:3 | if ... | IfExpr | loops.rb:9:1:12:3 | ! ... | loops.rb:9:1:12:3 | ... = ... | true |
26-
| loops.rb:16:1:19:3 | if ... | IfExpr | loops.rb:16:1:19:3 | ! ... | loops.rb:16:1:19:3 | ... = ... | true |
27-
| loops.rb:22:1:25:3 | if ... | IfExpr | loops.rb:22:1:25:3 | ! ... | loops.rb:22:1:25:3 | ... = ... | true |
28-
| loops.rb:22:1:25:3 | if ... | IfExpr | loops.rb:22:1:25:3 | ! ... | loops.rb:22:1:25:3 | ... = ... | true |
29-
| loops.rb:28:1:32:3 | if ... | IfExpr | loops.rb:28:1:32:3 | ! ... | loops.rb:28:1:32:3 | ... = ... | true |
30-
| loops.rb:28:1:32:3 | if ... | IfExpr | loops.rb:28:1:32:3 | ! ... | loops.rb:28:1:32:3 | ... = ... | true |
25+
| loops.rb:9:5:9:5 | if ... | IfExpr | loops.rb:9:5:9:5 | ! ... | loops.rb:9:5:9:5 | ... = ... | true |
26+
| loops.rb:16:5:16:5 | if ... | IfExpr | loops.rb:16:5:16:5 | ! ... | loops.rb:16:5:16:5 | ... = ... | true |
27+
| loops.rb:22:5:22:7 | if ... | IfExpr | loops.rb:22:5:22:7 | ! ... | loops.rb:22:5:22:7 | ... = ... | true |
28+
| loops.rb:22:10:22:14 | if ... | IfExpr | loops.rb:22:10:22:14 | ! ... | loops.rb:22:10:22:14 | ... = ... | true |
29+
| loops.rb:28:6:28:8 | if ... | IfExpr | loops.rb:28:6:28:8 | ! ... | loops.rb:28:6:28:8 | ... = ... | true |
30+
| loops.rb:28:11:28:15 | if ... | IfExpr | loops.rb:28:11:28:15 | ! ... | loops.rb:28:11:28:15 | ... = ... | true |
3131
ifExprs
3232
| conditionals.rb:10:1:12:3 | if ... | IfExpr | conditionals.rb:10:4:10:8 | ... > ... | conditionals.rb:10:10:11:5 | then ... | (none) | false |
3333
| conditionals.rb:15:1:19:3 | if ... | IfExpr | conditionals.rb:15:4:15:9 | ... == ... | conditionals.rb:15:10:16:5 | then ... | else ... | false |

ruby/ql/test/library-tests/ast/control/ControlExpr.expected

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@
2727
| conditionals.rb:61:1:64:3 | if ... | IfExpr |
2828
| conditionals.rb:67:1:70:3 | if ... | IfExpr |
2929
| loops.rb:9:1:12:3 | for ... in ... | ForExpr |
30-
| loops.rb:9:1:12:3 | if ... | IfExpr |
30+
| loops.rb:9:5:9:5 | if ... | IfExpr |
3131
| loops.rb:16:1:19:3 | for ... in ... | ForExpr |
32-
| loops.rb:16:1:19:3 | if ... | IfExpr |
32+
| loops.rb:16:5:16:5 | if ... | IfExpr |
3333
| loops.rb:22:1:25:3 | for ... in ... | ForExpr |
34-
| loops.rb:22:1:25:3 | if ... | IfExpr |
35-
| loops.rb:22:1:25:3 | if ... | IfExpr |
34+
| loops.rb:22:5:22:7 | if ... | IfExpr |
35+
| loops.rb:22:10:22:14 | if ... | IfExpr |
3636
| loops.rb:28:1:32:3 | for ... in ... | ForExpr |
37-
| loops.rb:28:1:32:3 | if ... | IfExpr |
38-
| loops.rb:28:1:32:3 | if ... | IfExpr |
37+
| loops.rb:28:6:28:8 | if ... | IfExpr |
38+
| loops.rb:28:11:28:15 | if ... | IfExpr |
3939
| loops.rb:35:1:39:3 | while ... | WhileExpr |
4040
| loops.rb:42:1:45:3 | while ... | WhileExpr |
4141
| loops.rb:48:1:48:19 | ... while ... | WhileModifierExpr |

ruby/ql/test/library-tests/controlflow/graph/Nodes.expected

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ callsWithNoArguments
2525
| cfg.rb:60:17:60:17 | call to b |
2626
| cfg.rb:62:7:62:12 | * ... |
2727
| cfg.rb:62:17:62:27 | * ... |
28-
| cfg.rb:90:1:93:3 | [false] ! ... |
29-
| cfg.rb:90:1:93:3 | [true] ! ... |
3028
| cfg.rb:90:1:93:3 | call to each |
31-
| cfg.rb:90:1:93:3 | defined? ... |
29+
| cfg.rb:90:5:90:5 | [false] ! ... |
30+
| cfg.rb:90:5:90:5 | [true] ! ... |
31+
| cfg.rb:90:5:90:5 | defined? ... |
3232
| cfg.rb:98:10:98:15 | ** ... |
3333
| cfg.rb:98:30:98:35 | ** ... |
3434
| cfg.rb:138:17:138:23 | * ... |

0 commit comments

Comments
 (0)